RosettaCodeData/Task/Cumulative-standard-deviation/Modula-2/cumulative-standard-deviation.mod2
2026-04-30 12:34:36 -04:00

70 lines
1.2 KiB
Text

MODULE CumulDev;
(* Cumulative standard deviation *)
FROM RealMath IMPORT
sqrt;
FROM SRealIO IMPORT
WriteFixed;
FROM STextIO IMPORT
WriteLn, WriteString;
FROM SWholeIO IMPORT
WriteInt;
TYPE
TSample = RECORD
N: CARDINAL;
Sum: REAL;
SumOfSquares: REAL
END;
TData = ARRAY [1 .. 8] OF REAL;
VAR
Test: TData;
S: TSample;
I: CARDINAL;
PROCEDURE Init(VAR OUT S: TSample);
BEGIN
WITH S DO
N := 0;
Sum := 0.0;
SumOfSquares := 0.0
END;
END Init;
PROCEDURE Add(VAR INOUT S: TSample; P: REAL);
BEGIN
WITH S DO
N := N + 1;
Sum := Sum + P;
SumOfSquares := SumOfSquares + P * P
END
END Add;
PROCEDURE Deviation (S: TSample): REAL;
VAR
Quot: REAL;
BEGIN
WITH S DO
Quot := Sum / FLOAT(N);
RETURN sqrt(SumOfSquares / FLOAT(N) - Quot * Quot)
END;
END Deviation;
BEGIN
Test := TData{2.0, 4.0, 4.0, 4.0, 5.0, 5.0, 7.0, 9.0};
Init(S);
WriteString("N ITEM AVG STDDEV");
WriteLn;
FOR I := 1 TO HIGH(Test) DO
Add(S, Test[I]);
WriteInt(I, 1);
WriteString(" ");
WriteFixed(Test[I], 1, 3);
WriteString(" ");
WriteFixed(S.Sum / FLOAT(I), 3, 5);
WriteString(" ");
WriteFixed(Deviation(S), 3, 5);
WriteLn
END;
END CumulDev.