一个变量i,从1-50,到50之后计算这50条数据的平均值.51之后,计算第2条数据到第51条数据的平均值
到52之后,计算第3条数据到第52条的平均值.依此递增!求算法.谢谢!

解决方案 »

  1.   

    最快的算法:
    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.
      

  2.   

    再修改下: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;
      

  3.   

    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.
      

  4.   

    如果数据是随机的,可以按下面的算法:
    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.