PROGRAM Temperature_Volume_Readings
!-----------------------------------------------------------------------
! Program to read temperatures and volumes from a file containing
! time, temperature, pressure, and volume readings made by some
! monitoring device.  The temperature and volume measurements are
! displayed in tabular form, and the equation of the least-squares
! line y = mx + b (x = temperature, y = volume) is calculated.
! Variables used are:
!   FileName         : name of data file
!   OpenStatus       : status variable for OPEN statement
!   InputStatus      : status variable for READ statement
!   Temperature      : temperature recorded
!   Volume           : volume recorded
!   Count            : count of (Temperature, Volume) pairs
!   SumOfTemps       : sum of temperatures
!   SumOfTemps2      : sum of squares of temperatures
!   SumOfVols        : sum of volumes 
!   SumOfProds       : sum of the products Temperature * Volume
!   MeanTemperature  : mean temperature
!   MeanVolume       : mean volume
!   Slope            : slope of the least-squares line
!   Y_Intercept      : y-intercept of the line
!
! Input (file):    Collection of temperature and volume readings 
! Output (screen): Table of readings and equation of least squares 
!                  line
!-----------------------------------------------------------------------

  IMPLICIT NONE
  INTEGER :: Count = 0, OpenStatus, InputStatus
  CHARACTER(20) :: FileName
  REAL :: Temperature, Volume, SumOfTemps = 0.0 , SumOfTemps2 = 0.0, &
          SumOfVols = 0.0, SumOfProds = 0.0, MeanTemperature, &
          MeanVolume, Slope, Y_Intercept

  ! Open the file as unit 15, set up the input and output
  ! formats, and display the table heading

  WRITE (*, '(1X, A)', ADVANCE = "NO") "Enter name of data file: "
  READ *, FileName
  OPEN (UNIT = 15, FILE = FileName, STATUS = "OLD", IOSTAT = OpenStatus)
  IF (OpenStatus > 0) STOP "*** Cannot open the file ***"

  100 FORMAT(4X, F4.1, T13, F4.1)
  110 FORMAT(1X, A11, A10)
  120 FORMAT(1X, F8.1, F12.1)
  PRINT *
  PRINT 110, "Temperature", "Volume"
  PRINT 110, "===========", "======"

  ! While there is more data, read temperatures and volumes,
  ! display each in the table, and calculate the necessary sums

  DO
    READ (UNIT = 15, FMT = 100, IOSTAT = InputStatus) Temperature, Volume
    IF (InputStatus > 0) STOP "*** Input error ***"
    IF (InputStatus < 0) EXIT  ! end of file

    PRINT 120, Temperature, Volume
    Count = Count + 1
    SumOfTemps = SumOfTemps + Temperature
    SumOfTemps2 = SumOfTemps2 + Temperature ** 2
    SumOfVols = SumOfVols + Volume
    SumOfProds = SumOfProds + Temperature * Volume
  END DO

  ! Find equation of least-squares line

  MeanTemperature = SumOfTemps / REAL(Count)
  MeanVolume = SumOfVols / REAL(Count)
  Slope = (SumOfProds - SumOfTemps * MeanVolume) / &
          (SumOfTemps2 - SumOfTemps * MeanTemperature)
  Y_Intercept = MeanVolume - Slope * MeanTemperature

  PRINT 130, Slope, Y_Intercept
  130 FORMAT(//1X, "Equation of least-squares line is"  &
             /1X, "     y =", F5.1, "x + ", F5.1,  &
             /1X, "where X is temperature and y is volume")

  CLOSE (15)
      
END PROGRAM Temperature_Volume_Readings
