c This program determines the median, mean, and standard deviation
c of the average gestation period and of the average life span of
c the 22 selected animals.
PROGRAM stats
c Specification statements
PARAMETER (numdat=22)
REAL mdgest, mdlife, mngest, mnlife, sdevgest, sdevlife
REAL sumgest, sumlife, sumsqg, sumsql
INTEGER numdat, hold, place,keep, j, m, p, q
INTEGER gest(numdat), life(numdat)
CHARACTER*15 animal(numdat), save
DATA sumgest, sumlife, sumsqg, sumsql/0,0,0,0/
c Variable Definitions
c mdgest = median gestation period
c mdlife = median life span
c mngest = mean gestation period
c mnlife = mean life span
c sdevgest = standard deviation for the gestation period
c sdevlife = standard deviation for the life span period
c sumgest = sum of the gestation periods of the 22 animals
c sumlife = sum of the life spans of the 22 animals
c sumsqg = sum of the squares of the differences of each gestation
c value and the mean gestation value
c sumsql = sum of the squares of the differences of each life span
c and the mean life span
c hold, place, keep, save = variables used in sorting values
c numdat = number of data values (22 in this case)
c gest = set of 22 gestation periods
c animal = set of 22 animals' names
c life = set of 22 life spans
OPEN(UNIT=20, FILE='animals.dat')
c Read the values from the data file animals.dat into the arrays
c animal (contains the animals' names), gest (contains the gestation
c period in days for each animal), and life (contains the life span
c in years for each animal).
DO 100 k = 1, numdat
READ (20,*) animal(k), gest(k), life(k)
100 CONTINUE
c Sort (from highest to lowest) the values in the array gest using
c the selection sort. So that the three are not separated from each
c other, all three must be moved at the same time.
DO 200 j = 1,numdat - 1
place = j
start = j + 1
DO 300 m = start, numdat
IF (gest(m) .LT. gest(place)) place = m
300 CONTINUE
save = animal(j)
hold = gest(j)
keep = life(j)
animal(j) = animal(place)
gest(j) = gest(place)
life(j) = life(place)
animal(place) = save
gest(place) = hold
life(place) = keep
200 CONTINUE
c Sort (from highest to lowest) the values in the array life using
c the selection sort.
DO 400 j = 1,numdat - 1
place = j
start = j + 1
DO 500 m = start, numdat
IF (life(m) .LT. life(place)) place = m
500 CONTINUE
hold = life(j)
save = animal(j)
life(j) = life(place)
animal(j) = animal(place)
life(place) = hold
animal(place) = save
400 CONTINUE
PRINT *
c Determine the median for the set of gestation values and the set
c of life span values. If numdat is odd, the location of the median
c in the array is (numdat/2 + 1). If numdat is even, there are two
c middle values and the locations of these values are (numdat/2) and
c (numdat/2 + 1). The median is the mean of these two middle values.
IF (mod(numdat,2) .NE. 0) THEN
mdgest = real(gest(numdat/2 + 1))
mdlife = real(life(numdat/2 + 1))
ELSE
mdgest = (real(gest(numdat/2)+gest(numdat/2 + 1)))/2.0
mdlife = (real(life(numdat/2)+life(numdat/2 + 1)))/2.0
END IF
PRINT *, 'The median gestation period is', mdgest
PRINT *, 'The median life span is', mdlife
c Find the mean gestation period (in days) and the mean life span
c (in years) by suming the values in each set and dividing by
c numdat.
DO 800 p = 1, numdat
sumgest = sumgest + gest(p)
sumlife = sumlife + life(p)
800 CONTINUE
mngest = real(sumgest)/real(numdat)
mnlife = real(sumlife)/real(numdat)
c Find the sample standard deviation, the standard measure of
c variations from the mean, for both sets of values.
DO 900 q = 1, numdat
sumsqg = sumsqg + (real(gest(q)) - mngest)**2
sumsql = sumsql + (real(life(q)) - mnlife)**2
900 CONTINUE
sdevgest = sqrt(sumsqg/real(numdat-1))
sdevlife = sqrt(sumsql/real(numdat-1))
PRINT *
PRINT *, 'The mean gestation period is', mngest, ' days'
PRINT *, 'with a standard deviation of', sdevgest
PRINT *
PRINT *, 'The mean life span is', mnlife, ' years'
PRINT *, 'with a standard deviation of', sdevlife
END