RosettaCodeData/Task/Averages-Simple-moving-average/Pascal/averages-simple-moving-aver...

79 lines
1.7 KiB
Plaintext

program sma;
type
tsma = record
smaValue : array of double;
smaAverage,
smaSumOld,
smaSumNew,
smaRezActLength : double;
smaActLength,
smaLength,
smaPos :NativeInt;
smaIsntFull: boolean;
end;
procedure smaInit(var sma:tsma;p: NativeUint);
Begin
with sma do
Begin
setlength(smaValue,0);
setlength(smaValue,p);
smaLength:= p;
smaActLength := 0;
smaAverage:= 0.0;
smaSumOld := 0.0;
smaSumNew := 0.0;
smaPos := p-1;
smaIsntFull := true
end;
end;
function smaAddValue(var sma:tsma;v: double):double;
Begin
with sma do
Begin
IF smaIsntFull then
Begin
inc(smaActLength);
smaRezActLength := 1/smaActLength;
smaIsntFull := smaActLength < smaLength ;
end;
smaSumOld := smaSumOld+v-smaValue[smaPos];
smaValue[smaPos] := v;
smaSumNew := smaSumNew+v;
smaPos := smaPos-1;
if smaPos < 0 then
begin
smaSumOld:= smaSumNew;
smaSumNew:= 0.0;
smaPos := smaLength-1;
end;
smaAverage := smaSumOld *smaRezActLength;
smaAddValue:= smaAverage;
end;
end;
var
sma3,sma5:tsma;
i : LongInt;
begin
smaInit(sma3,3);
smaInit(sma5,5);
For i := 1 to 5 do
Begin
write('Inserting ',i,' into sma3 ',smaAddValue(sma3,i):0:4);
writeln(' Inserting ',i,' into sma5 ',smaAddValue(sma5,i):0:4);
end;
For i := 5 downto 1 do
Begin
write('Inserting ',i,' into sma3 ',smaAddValue(sma3,i):0:4);
writeln(' Inserting ',i,' into sma5 ',smaAddValue(sma5,i):0:4);
end;
//speed test
smaInit(sma3,3);
For i := 1 to 100000000 do
smaAddValue(sma3,i);
writeln('100''000''000 insertions ',sma3.smaAverage:0:4);
end.