循环处理数据的有关问题
循环处理数据的问题
有个计划表,通常每期按下面的计划金额来还款就可以,但是如果第一期就还了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期应还款
为负时则还款 为正则无还款
------解决思路----------------------
有个计划表,通常每期按下面的计划金额来还款就可以,但是如果第一期就还了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.