循环处理数据的有关问题

循环处理数据的问题
本帖最后由 ldjssoft 于 2014-04-28 01:25:07 编辑
有个计划表,通常每期按下面的计划金额来还款就可以,但是如果第一期就还了500元,就要往后冲减,2期还0,3期只要还100。以此类推,请问要怎么写这个循环语句让下面的计划表在还款后重建呢?

原始表
期数  当期应还金额   实际还款金额  
 1           200                        0
 2           200                        0
 3           200                        0
 4           200                        0
 5           200                        0
       
(第一期还款500后,应新生成的表)
期数  当期应还金额   实际还款金额    
 1           200                        500
 2           0                             0
 3           100                        0
 4           200                        0
 5           200                        0
       
------解决思路----------------------
实际还款-200 X. n=第n期应还款




为负时则还款  为正则无还款
------解决思路----------------------
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Classes;

type
  TPhase = class
  private
    FNeedPay: Integer;
    FActualPaid: Integer;
  public
    constructor Create(const needpay: Integer);
    property NeedPay: Integer read FNeedPay write FNeedPay;
    property ActualPaid: Integer read FActualPaid write FActualPaid;
  end;

  TPhaseList = class(TList)
  private
  public
    constructor Create(const payperphase, phaseamount: Integer);
    procedure Clear(); override;
    function Pay(const paid, phase: Integer): Boolean;
    procedure Print();
  end;

{ TPhase }

constructor TPhase.Create(const needpay: Integer);
begin
  FNeedPay := needpay;
end;

{ TPhaseList }

procedure TPhaseList.Clear;
var
  i: Integer;
begin
  for i := 0 to Count - 1 do
  begin
    TObject(Items[i]).Free;
  end;
  inherited;
end;

constructor TPhaseList.Create(const payperphase, phaseamount: Integer);
var
  i: Integer;
begin
  inherited Create();
  for i := 1 to phaseamount do
  begin
    Add(TPhase.Create(payperphase));
  end;
end;


var
  PhaseList: TPhaseList;

function TPhaseList.Pay(const paid, phase: Integer): Boolean;
var
  i: Integer;
  totalpaid: Integer;
begin
  Result := False;
  if (phase < 1) or (phase > Count) then
    Exit;
  totalpaid := paid;
  with  TPhase(Items[phase - 1]) do
  begin
    ActualPaid := paid;
    totalpaid := totalpaid - NeedPay;
  end;
  for i := phase to Count - 1 do
  begin
    with TPhase(Items[i]) do
    begin
      totalpaid := totalpaid - NeedPay;
      if totalpaid >= 0 then
      begin
        NeedPay := 0;
      end
      else
      begin
        NeedPay := -totalpaid;
        Break;
      end;
    end;
  end;
  Result := totalpaid <= 0;
end;

procedure TPhaseList.Print();
var
  i: Integer;
begin
  Writeln('期数'#9'当期应还金额'#9'实际还款金额');
  for i := 0 to Count - 1 do
  begin
    with TPhase(Items[i]) do
    begin
      Writeln(Format('%d'#9'%d'#9#9'%d',[i+1, NeedPay, ActualPaid]));
    end;
  end;
end;

begin
  PhaseList := TPhaseList.Create(200, 10);  //10期 每期200
  PhaseList.Print();
  PhaseList.Pay(500, 1); //第一期还了500
  PhaseList.Print();
  PhaseList.Pay(400, 6); //第六期还了400
  PhaseList.Print();
  PhaseList.Pay(200, 9); //第六期还了400
  PhaseList.Print();
end.


循环处理数据的有关问题