! --------------------------------------------------------------------
! PROGRAM  MeanVariance:
!    This program reads in an array and computes the mean, variance
! and standard deviation of the data stored in the array.  Then, it
! displays an analysis table.  If a value is greater than the value
! of (mean + standard deviation), it displays a "good".  If a value
! is less than the value of (mean - standard deviation), it displays
! a "bad".
! --------------------------------------------------------------------

PROGRAM  MeanVariance
   IMPLICIT  NONE

   INTEGER, PARAMETER :: MAX_SIZE = 50       ! maximum array size
   REAL, DIMENSION(1:MAX_SIZE) :: Data       ! input array
   REAL               :: Mean, Variance, StdDev   ! results
   INTEGER            :: n                   ! actual array size
   INTEGER            :: i                   ! running index
   CHARACTER(LEN=40)  :: TitleHeading = '(1X, A//1X, A/1X, A)'
   CHARACTER(LEN=20)  :: For_Data     = '(I4, F7.2)'
   CHARACTER(LEN=50)  :: ResultFormat = '(/1X, A, F15.7/1X, A, F15.7/1X, A, F15.7/)'
   CHARACTER(LEN=20)  :: For_Analysis = '(I4, 2F7.2, A)'

   READ(*,*)  n                              ! read in input array
   READ(*,*)  (Data(i), i = 1, n)
   WRITE(*,TitleHeading)  "Input Data:", &
                          " No  Data",   &
                          "=== ======"
   WRITE(*,For_Data)   (i, Data(i), i = 1, n)

   Mean = 0.0                                ! compute mean
   DO i = 1, n
      Mean = Mean + Data(i)
   END DO
   Mean = Mean / n

   Variance = 0.0                            ! compute variance
   DO i = 1, n
      Variance = Variance + (Data(i) - Mean)**2
   END DO
   Variance = Variance / (n - 1)
   StdDev   = SQRT(Variance)                 ! compute standard deviation

   WRITE(*,ResultFormat)  "Mean               : ", Mean,      &
                          "Variance           : ", Variance,  &
                          "Standard Deviation : ", StdDev
   WRITE(*,TitleHeading)  "Analysis Table:",     &
                          " No  Data    Dev ",   &
                          "=== ======  ====="
   DO i = 1, n
      IF (Data(i) > Mean + StdDev) THEN
         WRITE(*,For_Analysis)  i, Data(i), Data(i) - Mean, " <-- Good"
      ELSE IF (Data(i) < Mean - StdDev) THEN
         WRITE(*,For_Analysis)  i, Data(i), Data(i) - Mean, " <-- Bad"
      ELSE
         WRITE(*,For_Analysis)  i, Data(i), Data(i) - Mean
      END IF
   END DO

END PROGRAM  MeanVariance