PROGRAM Normalize(DataIn, DataOut);

    {-------------------------------------------------------------
      program 9.1 - Normalize a file of measurements generated as
      real numbers from an instrument or another program
    -------------------------------------------------------------}

    TYPE
        Measurements = FILE OF Real;
        Natural = 0..MaxInt;
    VAR
        DataIn,
        DataOut: Measurements;

        Sum,
        Mean,
        SumOfSquares,
        StandardDeviation: Real;

        N: Natural;

BEGIN
    Rewrite(DataIn);
    DataIn^ := 14.1;
    Put(DataIn);
    DataIn^ := 12.2;
    Put(DataIn);
    Reset(DataIn);
    N := 0;
    Sum := 0.0;
    SumOfSquares := 0.0;

    WHILE NOT Eof(DataIn) DO BEGIN
        N := N + 1;
        Sum := Sum + DataIn^;
        SumOfSquares := SumOfSquares + Sqr(DataIn^);
        Get(DataIn)
    END;

    Mean := Sum / N;
    StandardDeviation := Sqrt( (SumOfSquares / N) - Sqr(Mean) );

    Reset(DataIn);
    Rewrite(DataOut);

    WHILE NOT Eof(DataIn) DO BEGIN
        DataOut^ := (DataIn^ - Mean) / StandardDeviation;
        Put(DataOut);
        Get(DataIn);
    END
END. { Normalize }

