本帖最后由 ldjssoft 于 2014-04-28 01:25:07 编辑

解决方案 »

  1.   

    实际还款-200 X. n=第n期应还款
    为负时则还款  为正则无还款
      

  2.   

    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.