Case Construct
Generalized Conditional
•	Conditional statement has two branches

•	It can be generalized to have  multiple branches

•	There are problems where different computations are invoked for different values of an expression 

•	expressions can have more than two values

Example
Problem:  Given an 24-hour clock value, compute the 
corresponding value in the  AM-PM clock

Solution: 
 AM-PM depends upon the value in the 24-hour clock:
      00:01 – 11:59    -  AM
       12 hours           - noon
       12:01 -  23:59   - PM
        00:00                - midnight   
The Program
The Program continued
    case(0)    !hour has the value 0
          if (minute = 0) then print *,"12 midnight"
          else print *, “0”,minute,“ AM"
    case(12)        !hour has the value 12
          if (minute = 0) then print *,"12 noon"
          else print *, "12:",minute,“ PM"
    case default
          print *, "error in hour“
end select
end program 

General form
•	Selection of branch decided by the variable in the select statement

•	The general form is:
         select case(exp)
                 case(sel1) block1
                 case(sel2) block2
    ...
                 case(seln) blockn
                 case default block(n+1)
          end select
General Case statement
•	The case expression is of type integer, character or logical
•	The case selector can be:
–	 Integer or truth value
–	 Integer1 : integer2
–	 Integer1:
–	 : integer2
–	 A list of integers
•	The case expression can not match more than one selector

The default case
•	Default case is optional and is the last

–	When none of the case selector match, this default case matches
–	Should be used with care
–	This case will remove run-time errors and hence may hide logical errors in the program
Execution of Case Statement

•	First the expression in the select case statement is executed

•	The first case branch following the select statement matching the evaluated value is selected

•	The block of statements following the selected case is executed

•	The control then moves to the statement that follows the select statement

•	The default case matches any value and hence executed when no other case matches
 The Cases
•	Range of values can be given, eg.,
          case(0:11), case(11:23)

•	Implicit endpoints allowed 
         case(:j) - all values <= j
         case(i:) - all values >=i

•	i,j must be constants

•	ranges and values for different cases must be disjoint
Nesting of Cases
•	Select statements can be nested
•	A select case statement appear in one or more blocks of the cases of another case statement.

•	The inner select statement should `end' within the same block
•	case statements apply to the innermost select statement
•	Case statements may be labelled

Example
                out:  select case(x)
                              case(1)
                                in:select case(y)
                                        case(0) block1
                                        default block2
                                    end select in
                               case(2)
                                     block3
                                default
                                     block4
                        end select out
A Calculator example
  read *, x,y
  read *, op
  select case(op)
      case(“+”) 
           print *, (x+y)
       case(“*”) 
           print *, (x*y)
        case(“/”)  ! Some problem with this character
            if (y==0) then
                 print *, “result undefined”
            else 
                 print *, (x/y)
         case default
                 print *, “undefined operation”
   end select
Exercises
1.	There is some problem in am_pm_clock program. Find and Improve the program

2.	Develop a program that converts from am-pm   format to 24-hour format

3.	Write a program to compute the number of        months in a given month