求一个队列算法
一个变量i,从1-50,到50之后计算这50条数据的平均值.
51之后,计算第2条数据到第51条数据的平均值
到52之后,计算第3条数据到第52条的平均值.
依此递增!
求算法.谢谢!
[解决办法]
procedure TForm1.btn1Click(Sender: TObject);
var
Num : array[1..200] of Integer; //数值
I,j,Sum : Integer;
average : array[1..150] of double; //平均值
begin
//初始化
for I := 1 to 200 do begin
Num[i] := I;
end;
sum := 0;
j := 1;
for I := 1 to 200 do begin
sum := sum + Num[i];
if I >= 50 then begin
if(I <> 50) then
Sum := Sum - Num[i-50];
average[j] := Sum / 50;
Inc(j);
end;
end;
end;
unit Unit2;
interface
uses
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.
unit Unit16;
interface
uses
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.