home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
mbug
/
mbug048.arc
/
LOAN.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1979-12-31
|
7KB
|
218 lines
{Loan Repayment Calculator}
{by Paul Shannon}
{MBUG member 1219}
{Calculates the total amount and total interest paid on a reducing balance
loan.}
var
INTEREST, BAL, INITBAL, PRINC, INTERESTRATE, REPAYMENT, REPAYTEST,
INITREPAYMENT, REPAYMENTSUM, FINALPAYMENT, INTERESTSUM,
MAXPAYMENT, STEP : REAL;
MONTH, YEAR : INTEGER;
MULTDISPLAY, AGAIN, VIDEO : CHAR;
procedure YESORNO (var YES {output} : CHAR);
begin {Yes or No}
YES := ' ';
while (YES <> 'N') and (YES <> 'Y') do
begin
WRITE (' (Y/N) ');
READLN (YES);
YES := UPCASE (YES)
end;
end; {Yes or No}
procedure TITLES;
begin
CLRSCR;
WRITELN ('Loan Repayment Calculator' : 40);
WRITELN ('By Paul Shannon' : 35);
WRITELN;
WRITELN (' This utility program is designed to calculate the total TIME, total');
WRITELN ('REPAYMENTS, and total INTEREST, on a reducing balance loan. All ');
WRITELN ('calculations are based on monthly interest calculations, and monthly');
WRITELN ('repayments.');
WRITELN;
WRITELN (' The difference between this and most other loan calculators, is it''s ability');
WRITELN ('to automatically increment the repayment rate, and recalculate the loan,');
WRITELN ('accordingly.');
WRITELN;
WRITELN (' While you are entering the data, you will be asked if you wish to do');
WRITELN ('multiple calculations. Should you answer yes, the computer will recalculate');
WRITELN ('your loan as many times as desired, each time incrementing the repayment rate');
WRITELN ('by a set step size. This should prove very useful when deciding how much');
WRITELN ('you wish to pay off your loan each month.')
end; {Titles}
procedure INPUT;
begin
WRITELN;
INITBAL := 0;
while INITBAL < 0.01 do
begin
WRITE ('Enter the PRINCIPAL to be borrowed: $'); READLN (INITBAL)
end;
PRINC := INITBAL;
INTERESTRATE := 100;
while (INTERESTRATE >= 100) or (INTERESTRATE < 0) doè begin
WRITE ('Enter the YEARLY (%) INTEREST RATE: ');
READLN (INTERESTRATE)
end;
INTERESTRATE := INTERESTRATE / 1200;
REPAYTEST := INITBAL * INTERESTRATE;
REPAYMENT := REPAYTEST - 1;
WRITE ('Multiple loan calculations?');
YESORNO (MULTDISPLAY);
while REPAYMENT <= REPAYTEST + 0.01 do
begin {Repayment test}
WRITE ('Enter the ');
if MULTDISPLAY = 'Y' then
WRITE ('MINIMUM ');
WRITE ('monthly repayment (must be greater than $',
REPAYTEST : 8 : 2, ') $'); READLN (REPAYMENT)
end {Repayment test};
if MULTDISPLAY = 'Y' then
begin {Multiple calculations}
MAXPAYMENT := PRINC + 1;
while MAXPAYMENT > PRINC do
begin
WRITE ('Enter the MAXIMUM monthly repayment: $');
READLN (MAXPAYMENT)
end;
WRITE ('Enter the step size: $'); READLN (STEP)
end {Multiple calculations}
end; {Input}
procedure DISPLAY;
begin
WRITE ('Do you wish to display the calculations?');
YESORNO (VIDEO);
if VIDEO = 'Y' then
begin
WRITELN;
WRITELN ('(Use CTRL-S to pause.)');
WRITELN;
DELAY (2000);
WRITELN ('Month' : 8, 'Initial' : 12, 'Interest' : 17,
'Repayment' : 15, 'Final' : 13);
WRITELN ('Balance' : 20, 'Balance' : 45);
WRITELN
end
else
begin
WRITELN;
WRITELN ('Please wait.')
end
end; {Display}
procedure CALCULATE;
begin
MONTH := 0;
REPAYMENTSUM := 0;
INITBAL := PRINC;
while INITBAL >= 0.01 do
begin {calculate loop}
MONTH := MONTH + 1;è INTEREST := INITBAL * INTERESTRATE;
if REPAYMENT > INITBAL + INTEREST then
begin
FINALPAYMENT := INITBAL + INTEREST;
REPAYMENTSUM := REPAYMENTSUM + FINALPAYMENT;
BAL := INITBAL + INTEREST - FINALPAYMENT
end
else
begin
REPAYMENTSUM := REPAYMENTSUM + REPAYMENT;
BAL := INITBAL + INTEREST - REPAYMENT
end;
if VIDEO = 'Y' then
WRITELN (MONTH : 5, INITBAL : 15 : 2, INTEREST : 15 : 2,
REPAYMENT : 15 : 2, BAL : 15 : 2);
INITBAL := BAL
end; {calculate loop}
YEAR := MONTH div 12;
MONTH := MONTH mod 12
end; {Calculate}
procedure PRINT_SINGLE;
begin
WRITELN;
WRITELN ('STATISTICS:');
WRITELN;
WRITELN ('Principal borrowed: $', PRINC : 10 : 2);
WRITELN ('Interest Rate:', INTERESTRATE * 1200 : 18 : 2,
'% p.a. (compounded montly) ');
WRITELN ('Repayment rate: $', REPAYMENT : 13 : 2, ' per month');
WRITELN;
WRITE ('Time: ', YEAR : 25, ' Year');
if YEAR <> 1 then
WRITE ('s');
WRITE (' and ', MONTH, ' month');
if MONTH <> 1 then
WRITELN ('s')
else WRITELN;
WRITELN ('Total Repayments: $', REPAYMENTSUM : 12 : 2);
WRITELN ('Total Interest: $', REPAYMENTSUM - PRINC : 12 : 2)
end; {Printout}
procedure MULTIPLE;
var
LINE : INTEGER;
CONTINUE : CHAR;
begin
LINE := 0;
VIDEO := 'N';
CONTINUE := 'Y';
WRITELN;
WRITELN ('$', PRINC : 12 : 2, ' at ', INTERESTRATE * 1200 : 5 : 2,
' % p.a.');
WRITELN;
WRITELN (' Monthly Time Total Total');
WRITELN (' Repayment Repayments Interest');
WRITELN;
while (REPAYMENT <= MAXPAYMENT) and (CONTINUE <> 'N') doè begin
CALCULATE;
LINE := LINE + 1;
WRITE (REPAYMENT : 10 : 2, YEAR : 9, ' year');
if YEAR <> 1 then
WRITE ('s, ')
else
WRITE (', ');
WRITE (MONTH : 2, ' month');
if MONTH <> 1 then
WRITE ('s')
else
WRITE (' ');
WRITELN (REPAYMENTSUM : 14 : 2, REPAYMENTSUM - PRINC : 14 : 2);
REPAYMENT := REPAYMENT + STEP;
if LINE > 22 then
begin
LINE := 0;
WRITE ('More?');
YESORNO (CONTINUE);
end {if}
end {while}
end; {Multiple}
begin {Main Program}
TITLES;
AGAIN := 'Y';
while AGAIN = 'Y' do
begin
INPUT;
if MULTDISPLAY = 'N' then
begin
DISPLAY;
CALCULATE;
PRINT_SINGLE
end
else
MULTIPLE;
WRITELN;
WRITE ('Any more calculations?');
YESORNO (AGAIN)
end {Again}
end. {Main Program}