! -------------------------------------------------------------------- ! PROGRAM ComputeMedian: ! This program contains an internal REAL function for computing the ! median of a set of input. The median of a set of N data values is ! defined as follows. First, the data values must be sorted. Then, ! the median is the middle value X(N/2+1) if N is odd; otherwise, the ! median is the average of the middle two values (i.e., (X(n)+X(N/2+1))/2). ! For example, the median of 4, 2, 3, 1 is 2.5 since the sorted data ! values are 1, 2, 3 and 4 and the average of the middle two data ! values is (2+3)/2. The median of 5, 3, 4, 1, 2 is 3 since 3 is the ! middle value of the sorted data 1, 2, 3, 4, 5. ! ! We shall use the sorting subroutine discussed earlier. ! -------------------------------------------------------------------- PROGRAM ComputeMedian USE Sorting IMPLICIT NONE INTEGER, PARAMETER :: ARRAY_SIZE = 20 INTEGER, DIMENSION(1:ARRAY_SIZE) :: DataArray INTEGER :: ActualSize INTEGER :: IOstatus INTEGER :: i DO READ(*,*,IOSTAT=IOstatus) ActualSize, (DataArray(i), i = 1, ActualSize) IF (IOstatus < 0) THEN WRITE(*,*) "End of data reached." EXIT ELSE IF (IOstatus > 0) THEN WRITE(*,*) "Something wrong in your data." EXIT ELSE WRITE(*,*) "InputData:" WRITE(*,*) (DataArray(i), i = 1, ActualSize) WRITE(*,*) WRITE(*,*) "Median = ", Median(DataArray, ActualSize) WRITE(*,*) END IF END DO CONTAINS ! -------------------------------------------------------------------- ! REAL FUNCTION Median() : ! This function receives an array X of N entries, copies its value ! to a local array Temp(), sorts Temp() and computes the median. ! The returned value is of REAL type. ! -------------------------------------------------------------------- REAL FUNCTION Median(X, N) IMPLICIT NONE INTEGER, DIMENSION(1:), INTENT(IN) :: X INTEGER, INTENT(IN) :: N INTEGER, DIMENSION(1:N) :: Temp INTEGER :: i DO i = 1, N ! make a copy Temp(i) = X(i) END DO CALL Sort(Temp, N) ! sort the copy IF (MOD(N,2) == 0) THEN ! compute the median Median = (Temp(N/2) + Temp(N/2+1)) / 2.0 ELSE Median = Temp(N/2+1) END IF END FUNCTION Median END PROGRAM ComputeMedian