最快的算法: unit Unit2;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm2 = class(TForm) Button1: TButton; Memo1: TMemo; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } procedure CalcAvg(StopedNum: integer); public { Public declarations } end;var Form2: TForm2;implementation{$R *.dfm}procedure TForm2.Button1Click(Sender: TObject); begin CalcAvg(StrToInt(Edit1.Text)); end;procedure TForm2.CalcAvg(StopedNum: integer); var i, n, iTotal: integer; iAvg: Real; begin if StopedNum < 50 then begin Memo1.Lines.Add('Wrong Time'); exit; end; i := 0; n := 0; iTotal := 0; Memo1.Clear; while i < StopedNum do begin Inc(i); if i < 50 then iTotal := iTotal + i; if i > 49 then begin iAvg := (iTotal + (i - 50 + 1) *50) / 50; Memo1.Lines.Add(IntToStr(i - 50 + 1) +' To '+ IntToStr(i) + ', Avg Is: ' + FloatToStr(iAvg)); end; end; end;end.
再修改下:procedure TForm2.CalcAvg(StopedNum: integer); var i, iTotal: integer; iAvg: Real; begin if StopedNum < 50 then begin Memo1.Lines.Add('Wrong Time'); exit; end; i := 0; iTotal := 0; Memo1.Clear; while i < StopedNum do begin Inc(i); if i < 50 then iTotal := iTotal + i else begin iAvg := (iTotal + (i - 50 + 1) *50) / 50; Memo1.Lines.Add(IntToStr(i - 50 + 1) +' To '+ IntToStr(i) + ', Avg Is: ' + FloatToStr(iAvg)); end; end; end;
Delphi XE 测试通过unit Unit16;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm16 = class(TForm) btnCalc: TButton; mmo1: TMemo; edtStep: TEdit; procedure btnCalcClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } MyArr : array of integer; procedure CalcAvg(const iStep: integer); //计算给定步长的数据平均值 public { Public declarations } end;var Form16: TForm16;implementation{$R *.dfm} procedure TForm16.CalcAvg(const iStep : integer); var i : integer; DSum : Double; begin if (iStep < Low(MyArr)) or (iStep > High(MyArr)) then exit; mmo1.Clear; mmo1.Lines.Add(Format('计算平均数, 步长为%d', [iStep])); DSum := 0; for I := Low(MyArr) to iStep - 1 do DSum := DSum + MyArr[i]; mmo1.Lines.Add(Format('%d-%d, 平均数=%0.2f', [i - iStep, i - 1, DSum / iStep])); while i <= High(MyArr) do begin DSum := DSum - MyArr[i - iStep] + MyArr[i]; mmo1.Lines.Add(Format('%d-%d, 平均数=%0.2f', [i - iStep + 1, i, DSum / iStep])); Inc(i); end; end; procedure TForm16.FormCreate(Sender: TObject); var I: Integer; begin //填充数组 SetLength(MyArr, 100); for I := Low(MyArr) to High(MyArr) do MyArr[i] := i; end;procedure TForm16.btnCalcClick(Sender: TObject); begin CalcAvg(StrToInt(edtStep.text)); //edtStep为步长值 end;end.
如果数据是随机的,可以按下面的算法: unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } procedure CalcAvg(DataAry: array of integer); public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.CalcAvg(DataAry: array of integer); var i, iSum: integer; iAvg: Real; SumAry: array of integer; begin iSum := 0; Memo1.Clear; SetLength(SumAry, Length(DataAry)); for i := 0 to Length(DataAry) - 1 do begin if i > 0 then SumAry[i] := SumAry[i - 1] + DataAry[i] else SumAry[i] := DataAry[i]; if i + 1 > 49 then begin if i + 1 = 50 then iAvg := SumAry[i] / 50 else iAvg := (SumAry[i] - SumAry[i - 50 - 1]) / 50; Memo1.Lines.Add('Num' + IntToStr(i - 50 + 1) +' To Num'+ IntToStr(i) + ', Avg Is: ' + FloatToStr(iAvg)); end; end; end;procedure TForm1.FormCreate(Sender: TObject); begin Randomize; end;procedure TForm1.Button1Click(Sender: TObject); var i: integer; Data: array of integer; begin SetLength(Data, StrToInt(Edit1.Text)); for i := 0 to Length(Data) - 1 do Data[i] := Random(100); CalcAvg(Data); end;end.
unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm2 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure CalcAvg(StopedNum: integer);
public
{ Public declarations }
end;var
Form2: TForm2;implementation{$R *.dfm}procedure TForm2.Button1Click(Sender: TObject);
begin
CalcAvg(StrToInt(Edit1.Text));
end;procedure TForm2.CalcAvg(StopedNum: integer);
var
i, n, iTotal: integer;
iAvg: Real;
begin
if StopedNum < 50 then
begin
Memo1.Lines.Add('Wrong Time');
exit;
end; i := 0;
n := 0;
iTotal := 0;
Memo1.Clear;
while i < StopedNum do
begin
Inc(i);
if i < 50 then
iTotal := iTotal + i;
if i > 49 then
begin
iAvg := (iTotal + (i - 50 + 1) *50) / 50;
Memo1.Lines.Add(IntToStr(i - 50 + 1) +' To '+ IntToStr(i) + ', Avg Is: ' + FloatToStr(iAvg));
end;
end;
end;end.
var
i, iTotal: integer;
iAvg: Real;
begin
if StopedNum < 50 then
begin
Memo1.Lines.Add('Wrong Time');
exit;
end; i := 0;
iTotal := 0;
Memo1.Clear;
while i < StopedNum do
begin
Inc(i);
if i < 50 then
iTotal := iTotal + i
else
begin
iAvg := (iTotal + (i - 50 + 1) *50) / 50;
Memo1.Lines.Add(IntToStr(i - 50 + 1) +' To '+ IntToStr(i) + ', Avg Is: ' + FloatToStr(iAvg));
end;
end;
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm16 = class(TForm)
btnCalc: TButton;
mmo1: TMemo;
edtStep: TEdit;
procedure btnCalcClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
MyArr : array of integer;
procedure CalcAvg(const iStep: integer); //计算给定步长的数据平均值
public
{ Public declarations }
end;var
Form16: TForm16;implementation{$R *.dfm}
procedure TForm16.CalcAvg(const iStep : integer);
var
i : integer;
DSum : Double;
begin
if (iStep < Low(MyArr)) or (iStep > High(MyArr)) then
exit; mmo1.Clear;
mmo1.Lines.Add(Format('计算平均数, 步长为%d', [iStep])); DSum := 0;
for I := Low(MyArr) to iStep - 1 do
DSum := DSum + MyArr[i]; mmo1.Lines.Add(Format('%d-%d, 平均数=%0.2f', [i - iStep, i - 1, DSum / iStep])); while i <= High(MyArr) do
begin
DSum := DSum - MyArr[i - iStep] + MyArr[i];
mmo1.Lines.Add(Format('%d-%d, 平均数=%0.2f', [i - iStep + 1, i, DSum / iStep]));
Inc(i);
end;
end;
procedure TForm16.FormCreate(Sender: TObject);
var
I: Integer;
begin
//填充数组
SetLength(MyArr, 100);
for I := Low(MyArr) to High(MyArr) do
MyArr[i] := i;
end;procedure TForm16.btnCalcClick(Sender: TObject);
begin
CalcAvg(StrToInt(edtStep.text)); //edtStep为步长值
end;end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure CalcAvg(DataAry: array of integer);
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.CalcAvg(DataAry: array of integer);
var
i, iSum: integer;
iAvg: Real;
SumAry: array of integer;
begin
iSum := 0;
Memo1.Clear;
SetLength(SumAry, Length(DataAry));
for i := 0 to Length(DataAry) - 1 do
begin
if i > 0 then
SumAry[i] := SumAry[i - 1] + DataAry[i]
else
SumAry[i] := DataAry[i]; if i + 1 > 49 then
begin
if i + 1 = 50 then
iAvg := SumAry[i] / 50
else
iAvg := (SumAry[i] - SumAry[i - 50 - 1]) / 50;
Memo1.Lines.Add('Num' + IntToStr(i - 50 + 1) +' To Num'+ IntToStr(i) + ', Avg Is: ' + FloatToStr(iAvg));
end;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
end;procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
Data: array of integer;
begin
SetLength(Data, StrToInt(Edit1.Text));
for i := 0 to Length(Data) - 1 do
Data[i] := Random(100); CalcAvg(Data);
end;end.