# Cm and Inch Conversion - Revisited

### Problem Statement

It is known that 1 cm is equal to 0.3937 inch and 1 inch is equal to 2.54 cm. Write a program that uses external functions to convert 0, 0.5, 1, 1.5, ..., 8, 8.5, 9, 9.5, and 10 from cm to inch and from inch to cm. A version using internal functions can be found in an earlier page.

### Solution

The following solution has the main program and the two conversion functions in the same file. The order of placing these functions and the main program in the file is unimportant.
```! ---------------------------------------------------------------
!    This program "contains" two REAL functions:
!         (1)  Cm_to_Inch() takes a real inch unit and converts
!              it to cm unit, and
!         (2)  Inch_to_cm() takes a real cm unit and converts it
!              to inch unit.
! The main program uses these functions to convert 0, 0.5, 1, 1.5,
! 2.0, 2.5, ..., 8.0, 8.5, 9.0, 9.5 and 10.0 inch (resp., cm) to
! cm (resp., inch).
! ---------------------------------------------------------------

PROGRAM  Conversion
IMPLICIT  NONE

INTERFACE
REAL FUNCTION  Cm_to_Inch(cm)
REAL, INTENT(IN) :: cm
END FUNCTION  Cm_to_Inch

REAL FUNCTION  Inch_to_Cm(inch)
REAL, INTENT(IN) :: inch
END FUNCTION  Inch_to_Cm
END INTERFACE

REAL, PARAMETER :: Initial = 0.0, Final = 10.0, Step = 0.5
REAL            :: x

x = Initial
DO                         ! x = 0, 0.5, 1.0, ..., 9.0, 9.5, 10
IF (x > Final)  EXIT
WRITE(*,*)  x, 'cm = ',   Cm_to_Inch(x), 'inch and ',  &
x, 'inch = ', Inch_to_Cm(x), 'cm'
x = x + Step
END DO

END PROGRAM  Conversion

! ---------------------------------------------------------------
! REAL FUNCTION  Cm_to_Inch()
!    This function converts its real input in cm to inch.
! ---------------------------------------------------------------

REAL FUNCTION  Cm_to_Inch(cm)
IMPLICIT  NONE

REAL, INTENT(IN) :: cm
REAL, PARAMETER  :: To_Inch = 0.3937   ! conversion factor

Cm_to_Inch = To_Inch * cm
END FUNCTION  Cm_to_Inch

! ---------------------------------------------------------------
! REAL FUNCTION  Inch_to_Cm()
!    This function converts its real input in inch to cm.
! ---------------------------------------------------------------

REAL FUNCTION  Inch_to_Cm(inch)
IMPLICIT  NONE

REAL, INTENT(IN) :: inch
REAL, PARAMETER  :: To_Cm = 2.54       ! conversion factor

Inch_to_Cm = To_Cm * inch
END FUNCTION  Inch_to_Cm
```

### Program Input and Output

The following is the output from the above program.
``` 0.E+0cm = 0.E+0inch and 0.E+0inch = 0.E+0cm
0.5cm = 0.196850002inch and 0.5inch = 1.26999998cm
1.cm = 0.393700004inch and 1.inch = 2.53999996cm
1.5cm = 0.590550005inch and 1.5inch = 3.80999994cm
2.cm = 0.787400007inch and 2.inch = 5.07999992cm
2.5cm = 0.984250009inch and 2.5inch = 6.3499999cm
3.cm = 1.18110001inch and 3.inch = 7.61999989cm
3.5cm = 1.37794995inch and 3.5inch = 8.88999939cm
4.cm = 1.57480001inch and 4.inch = 10.1599998cm
4.5cm = 1.77165008inch and 4.5inch = 11.4300003cm
5.cm = 1.96850002inch and 5.inch = 12.6999998cm
5.5cm = 2.16534996inch and 5.5inch = 13.9699993cm
6.cm = 2.36220002inch and 6.inch = 15.2399998cm
6.5cm = 2.55905008inch and 6.5inch = 16.5100002cm
7.cm = 2.75589991inch and 7.inch = 17.7799988cm
7.5cm = 2.95274997inch and 7.5inch = 19.0499992cm
8.cm = 3.14960003inch and 8.inch = 20.3199997cm
8.5cm = 3.34645009inch and 8.5inch = 21.5900002cm
9.cm = 3.54330015inch and 9.inch = 22.8600006cm
9.5cm = 3.74014997inch and 9.5inch = 24.1299992cm
10.cm = 3.93700004inch and 10.inch = 25.3999996cm
```

### Discussion

• External function Cm_to_Inch() converts its formal argument cm to inch, which is returned as the function value. Please note that the constant 0.3937 is defined to be a PARAMETER.
• External function Inch_to_Cm() converts its formal argument inch to cm, which is returned as the function value. Please note that the constant 2.54 is defined to be a PARAMETER.
• The main program uses DO-EXIT-END DO to generate 0, 0.5, 1, 1.5, ..., 8, 8.5, 9, 9.5 and 10. For each value, Cm_to_Inch() and Inch_to_Cm() are called to perform conversion.
• To provide the main program with correct information of the two external functions, the following interface block is inserted in the beginning of the main program:
```   INTERFACE
REAL FUNCTION  Cm_to_Inch(cm)
REAL, INTENT(IN) :: cm
END FUNCTION  Cm_to_Inch

REAL FUNCTION  Inch_to_Cm(inch)
REAL, INTENT(IN) :: inch
END FUNCTION  Inch_to_Cm
END INTERFACE
```