Computing and Printing the Input Data and Their Average: Version 5

WARNING: This example assumes spaces are ignored for the I and F descriptors and the output is sent to a printer.

Problem Statement

We shall rewrite a program discussed earlier. In this new version, report printing will take advantage of the slash edit descriptor to simplify the design of formats. Click here to review the earlier version.

The mean, variance and standard deviation of a set of data can be computed with the following formulas:

Write a program to read in a set of real values and use the above formulas to compute the mean, variance and standard deviation. Moreover, this program should generate a table containing the following addition information:

The input data and the table should be printed as follows:

         1    1    2    2    3    3    4
....5....0....5....0....5....0....5....0
 Input Data:

  No  Data
 === ======
   1   6.60
   2   6.00
   3   4.00
     :
     :
     :
  10   5.20

 Mean               :       6.7100000
 Variance           :       3.3498888
 Standard Deviation :       1.8302702

 Analysis Table:

  No  Data    Dev
 === ======  =====
   1   6.60  -0.11
   2   6.00  -0.71
   3   4.00  -2.71 <-- Bad
   4   9.00   2.29 <-- Good
   5   4.50  -2.21 <-- Bad
   6   7.30   0.59
   7   9.50   2.79 <-- Good
   8   8.00   1.29
   9   7.00   0.29
  10   5.20  -1.51

Solution

! --------------------------------------------------------------------
! 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
Click here to download this program.

Program Input and Output

If the input data consist of the following:
10
6.6  6.0  4.0  9.0
4.5  7.3  9.5  8.0
7.0  5.2
The output of the program is:
         1    1    2    2    3    3    4
....5....0....5....0....5....0....5....0
 Input Data:

  No  Data
 === ======
   1   6.60
   2   6.00
   3   4.00
   4   9.00
   5   4.50
   6   7.30
   7   9.50
   8   8.00
   9   7.00
  10   5.20

 Mean               :       6.7100000
 Variance           :       3.3498888
 Standard Deviation :       1.8302702

 Analysis Table:

  No  Data    Dev
 === ======  =====
   1   6.60  -0.11
   2   6.00  -0.71
   3   4.00  -2.71 <-- Bad
   4   9.00   2.29 <-- Good
   5   4.50  -2.21 <-- Bad
   6   7.30   0.59
   7   9.50   2.79 <-- Good
   8   8.00   1.29
   9   7.00   0.29
  10   5.20  -1.51

Discussion

We will not discuss the logic of this program. In what follows, only the output part will be addressed. Please click here for the details of program logic.