Index TOC

Loan Amortization Program

written in

GW-Basic


0 'Loan Amortization Program by fhb4family 4/20/99
1 'Math algorithms from Professor D. Huff's book, "How to figure it" Norton
2 '(he was my old math teacher in the last century)
3 '----------------------------------
4 'Program-Housekeeping&Variables:
5    KEY OFF:ON ERROR GOTO 255
6    VIEW PRINT
7    COLOR 14,4              'used red for "red ink" that loan represents
8    FOR I=1 TO 10:KEY I,"":NEXT I:I=0  'null out function keys
9    CHAR.ALLOW$="0123456789." 'only these ascii characters allowed as input
10    CP6$="###,###.##"       'Comma & Penny for up to 6 digits
11   DCP6$="$$##,###.##"      'Dollar, Comma, Penny for up to 6 digits
12    DC6$="$$##,###"         'Dollar, Comma for up to 6 digits
13   DCP7$="$$####,###.##"    'Dollar, Comma for up to 7 digits
14 '----------------------------------
15 'OpeningScreenSplash:
16    CLS                                  'Three asterisks at line's end
17    PRINT TAB(31)"Amortization Table"    'signal a line which needs to be 
18    PRINT TAB(29)"Input Loan Conditions" 'altered if program is compiled.
19    LOCATE 24,24:PRINT"(Q) to edit         (X) to System";
20    'locate 24,35:print "X = system"                                   '***
21 '----------------------------------
22 'InputMemoryInterestRateString&Check:
23    ROW=6
24    LOCATE 6,29
25    INPUT " Interest percent";MA$
26 'if you want to edit or quit then turn off error checking upon quit...
27    IF LEN(MA$)=1 AND (MA$= "q" OR MA$="Q") THEN CLS:ON ERROR GOTO 0:LIST 308-334 
28    IF LEN(MA$)=1 AND (MA$= "x" OR MA$="X") THEN color 7,0:cls:system 'RUN"mnu-biz
29    IF LEN(MA$)>5 THEN GOSUB 264:GOTO 22 'ClearInputLine & start over
30 'Check for letters input in interest rate (MA$)
31    FOR I=1 TO LEN(MA$)
32      IF INSTR(CHAR.ALLOW$,MID$(MA$,I,1))=0 THEN BAD.INPUT$="yes"
33      NEXT I
34  IF BAD.INPUT$="yes" THEN GOSUB 264:GOTO 22
35 'is Interest entry an acceptable number & do boundary checks...
36 MA=VAL(MA$)
37    IF MA>0 AND MA<1 THEN MA=MA*100
38   'IF MA>1.01 AND MA<1.99 THEN MA=(MA-1)*100
39    IF MA<=0  THEN GOSUB 264:GOTO 22      'clear entry  then retry
40    IF MA>99 OR MA<1 THEN GOSUB 264:GOTO 22
41 '----------------------------------
42 'InputPrincipal:
43    ROW=8
44    LOCATE 8, 30
45    INPUT"Principal amount";MB$
46 'do you want to edit or quit?  then turn off error checking upon quit...
47    IF LEN(MB$)=1 AND (MB$="q" OR MB$="Q") THEN CLS:ON ERROR GOTO 0:LIST 308-334 
48    IF LEN(MB$)=1 AND (MB$="x" OR MB$="X") THEN color 7,0:cls:system 'RUN"mnu-biz
49 'is principal amount too big for your wallet?  then...
50    IF LEN(MB$)>6 THEN GOSUB 264:GOTO 42
51 'any unallowed characters input into principal?  then...
52    FOR I=1 TO LEN(MB$)
53      IF INSTR(CHAR.ALLOW$,MID$(MB$,I,1))=0 THEN BAD.INPUT$="yes" 
54      NEXT I
55    IF BAD.INPUT$="yes" THEN GOSUB 264:GOTO 42
56 'one last whack at it...
57    IF VAL(MB$)=0 THEN GOSUB 264:GOTO 42
58 'Convert principal to acceptable number &  do a wallet checks...
59 MB=VAL(MB$)
60    IF MB<1 OR MB>999999! THEN GOSUB 264:GOTO 42
61 '----------------------------------
62 'InputTerm:
63    ROW=10
64    LOCATE 10, 30
65    INPUT" Number of years";MC$      'Term of loan in years
66 'do you want to edit or quit?  then turn off error checking upon exit...
67    IF LEN(MC$)=1 AND (MC$="q" OR MC$="Q") THEN CLS:ON ERROR GOTO 0:LIST 308-334 
68    IF LEN(MC$)=1 AND (MC$="x" OR MC$="X") THEN color 7,0:cls:system 'RUN"mnu-biz
69 'is term too long?  then...
70    IF LEN(MC$)>2 THEN GOSUB 264:GOTO 62
71 'any unallowed characters input into term?  then...
72    FOR I=1 TO LEN(MC$)
73      IF INSTR(CHAR.ALLOW$,MID$(MC$,I,1))=0 THEN BAD.INPUT$="yes"
74      NEXT I
75    IF BAD.INPUT$="yes" THEN GOSUB 264:GOTO 62
76 'one last whack at it...
77    IF VAL(MC$)=0 THEN GOSUB 264:GOTO 62
78 'Convert principal to acceptable number &  do a wallet checks...
79 MC=VAL(MC$)
80    IF MC<1 OR MC>99 THEN GOSUB 264:GOTO 62
81 '---------------------------------
82 'InputPaymentsPerYear:
83    ROW=12
84    LOCATE 12, 29
85    INPUT"Payments per year";MD$    'Repayments per year
86 'do you want to edit or quit?  then turn off error checking upon quit...
87    IF LEN(MD$)=1 AND (MD$="q" OR MD$="Q") THEN CLS:ON ERROR GOTO 0:LIST 308-334
88    IF LEN(MD$)=1 AND (MD$="x" OR MD$="X") THEN color 7,0:cls:system 'RUN"mnu-biz
89 'is PAYMENTS.PER.YEAR too many?  then...
90    IF LEN(MD$)>3 THEN GOSUB 264:GOTO 82
91 'any unallowed characters input into Payments per year? then...
92    FOR I=1 TO LEN(MD$)
93      IF INSTR(CHAR.ALLOW$,MID$(MD$,I,1))=0 THEN BAD.INPUT$="yes"
94      NEXT I
95    IF BAD.INPUT$="yes" THEN GOSUB 264:GOTO 82
96 'one last whack at it...
97    IF VAL(MD$)=0 THEN GOSUB 264:GOTO 82
98 'Convert term to acceptable number...
99    IF VAL(MD$)<1 OR VAL(MD$)>366 THEN GOSUB 264:GOTO 82
100 MD=VAL(MD$)
101 '---------------------------------
102 'ConvertMemoryVariables2WorkingVariables:
103     A=MA                   'rate of interest
104     B=MB                   'principal
105     C=MC                   'term
106     D=MD                   'payments per year
107     I=A/(100*D)            'Monthly interest rate = I  
108     R=B*I/(1-(1+I)^(-D*C)) 'Monthly repayment amount
109  TLIP=(R*D*C)-B            'Total Loan Interest Paid
110   TPI=R*D*C                'Total Principal & Interest
111     J=0
112     K=0
113  YEAR=0
114 '---------------------------------
115 'PrintOpeningDataScreen:
116    CLS
117    PRINT TAB(31)"Amortization Table":PRINT
118    PRINT TAB(10) "Interest   Principal      Term";
119    PRINT TAB(46) "Payments       Payment"
120    PRINT TAB(10) USING "##.##";A;:PRINT"%";
121    PRINT TAB(22) USING DC6$;B;
122    PRINT TAB(34) C;:PRINT"yrs";
123    PRINT TAB(45) D;:PRINT"/year";
124    PRINT TAB(57) USING DCP6$;R
125    PRINT
126    PRINT TAB(11) "No.        Interest         ";
127    PRINT TAB(39) "Principal             Balance"
128    VIEW PRINT 7 TO 24
129    PRINT TAB(57) USING DCP6$;B;
130 '---------------------------------
131 'DoCalcStuff&PrintAmortizationLoop:
132    I=0
133 WHILE R < B
134    A1=A/100   'convert integer to decimal yearly interest rate
135    A2=A1/D    'divided by payments/year = monthly decimal interest rate
136    B1=B*A2    'monthly interest = Balance x monthly rate of interest
137    B2=R-B1    'Amt. applied to prin. = Monthly payment-monthly interest
138     B=B-B2    'Balance = Balance - Amount Applied to principal
139     K=K+1     'using K here as an iteration counter for payment no.
140     J=J+1     'same with J except it is used just to control scrolling.
141     I=I+1     '????
142   IF I > 12 THEN GOSUB 283:I=0
143    PRINT TAB(10) K;
144    PRINT TAB(20) USING CP6$;B1;
145    PRINT TAB(38) USING CP6$;B2;
146    PRINT TAB(58) USING CP6$;B;
147  IF J=D THEN YEAR=YEAR+1:GOSUB 274
148 WEND  '^^^^^^^^^^^^^^^^^^^Loop thru amortization calculations
149 '---------------------------------
150 'LastPaymentPrintout:
151 K=K+1      'Advance the payment no. counter by 1 (out of loop)
152 B1=B*A2    'monthly interest on last payment
153 'now print out all the last payment stuff on the last line.
154    PRINT TAB(10) K;
155    PRINT TAB(20) USING CP6$;B1;
156    PRINT TAB(38) USING CP6$;B+B1;
157    PRINT TAB(58) USING CP6$;0  'make it pretty...
158 '---------------------------------
159 'PrintPrincipal&InterestSummation:
160    PRINT TAB(19) "Total Loan Interest Paid  :";USING DCP7$;TLIP
161    PRINT TAB(19) "Total Principal & Interest:";USING DCP7$;TPI;
162 YEAR=YEAR+1
163 GOSUB 274 'to ScreenPauser#2
164 '---------------------------------
165 'Wrapup:
166    VIEW PRINT:CLS
167    LOCATE 10,25:PRINT "Do another Calculation (y/n) ?"
168    LOCATE 25,1:PRINT "Spacebar=see again";
169    LOCATE 25,37:PRINT "P=print";
170    LOCATE 25,70:PRINT "Esc=edit";
171 GOSUB 283 'ScreenPauser#3
172    IF KP$="y" OR KP$="Y" THEN 4 'Program
173    IF KP$=" " THEN GOTO 102 're-createWORKINGLoanVariables
174    IF KP$="p" OR KP$="P" THEN GOSUB 182:GOSUB 283
175    IF KP$=CHR$(27) THEN CLS:LIST 308-334                          '***
176    IF KP$="n" OR KP$="N" THEN COLOR 7,0:CLS:SYSTEM
177    'IF KP$="n" OR KP$="N" THEN RUN"mnu-biz                         '***
178 GOTO 165 'Wrapup
179 '  
180 '==================  P R I N T E R    O U T P U T ==============
181 '
182 'PrinterOutput-ResetLoanVariablesForRecalc
183   CLS 'Reassign memory variables to working printer variables...
184   LOCATE 10,18
185   PRINT"Printing...  Press the Anykey when finished.";
186 'How many of these reassignments are unnecessary?
187    A=MA                   'rate of interest
188    B=MB                   'principal
189    C=MC                   'term
190    D=MD                   'payments per year
191    I= A/(100*D)           'Monthly interest rate
192    R=B*I/(1-(1+I)^(-D*C)) 'Monthly repayment amount
193 TLIP=(R*D*C)-B            'Total Loan Interest Paid
194  TPI=R*D*C                'Total Principal & Interest
195    J=0                    'Line counter 
196    K=0                    'Payment number
197 YEAR=0                    'year number - but not needed here just yet... 
198 '---------------------------------
199 'PrinterOutput-AmortizationHeading&LoanTerms
200   LPRINT TAB(31)"Amortization Table"
201   LPRINT
202   LPRINT TAB(10) "Interest   Principal      Term";
203   LPRINT TAB(46) "Payments     Monthly Payment"
204   LPRINT TAB(10) USING "##.##";A;:LPRINT"%";
205   LPRINT TAB(22) USING DC6$;MB;
206   LPRINT TAB(34) C;:LPRINT"yrs";
207   LPRINT TAB(45) D;:LPRINT"/year";
208   LPRINT TAB(57) USING DCP6$;R
209   LPRINT
210   LPRINT TAB(11) "No.        Interest";
211   LPRINT TAB(39) "Principal             Balance"
212   LPRINT TAB(57) USING DCP6$;B;
213 '---------------------------------
214 'PrinterOutput-DoCalcStuff&PrintAmortizationLoop:
215 WHILE J<48
216   A1=A/100     'convert integer to decimal yearly interest rate
217   A2=A1/D      'divided by payments/year = monthly decimal interest rate
218   B1=B*A2      'monthly interest = Balance x monthly rate of interest
219   B2=R-B1      'Amt. applied to prin. = Monthly payment-monthly interest
220   B=B-B2       'Balance = Balance - Amount Applied to principal
221   K=K+1        'using K here as an iteration counter for payment no.
222   J=J+1        'same with J except it is used just to control scrolling.
223   L=L+1
224   LPRINT TAB(10) K;
225   LPRINT TAB(20) USING CP6$;B1;
226   LPRINT TAB(38) USING CP6$;B2;
227   LPRINT TAB(58) USING CP6$;B
228   IF L=D THEN LPRINT:L=0 'separate the years with a blank line
229   IF B < R  THEN GOTO 237  'PrinterOutput-LastPaymentPrintOut
230 WEND                  '^^^^^^^^^^^^^^^^^^^^^Looper
231 LPRINT:J=0 'added an lprint here to get to 60 lines to trigger a formfeed
232 GOTO 199 'start a new page (if you are using an inkjet w 60 lines/page)
233           'if you are not using a page length of 60 lines then 
234           'add a few lprints to trigger a formfeed... sorry
235           'i will try an put in a HP-PCL3 code for 60 lines later...
236 '---------------------------------
237 'PrinterOutput-LastPaymentPrintout:
238   B1 = B * A2 'monthly interest on last payment
239   LPRINT TAB(10) K+1;
240   LPRINT TAB(20) USING CP6$;B1;
241   LPRINT TAB(38) USING CP6$;B+B1;
242   LPRINT TAB(58) USING CP6$;0
243 '---------------------------------
244 'PrinterOutput-PrintPrincipal&InterestSummation:
245   LPRINT
246   LPRINT TAB(19) "Total Loan Interest Paid  :";USING DCP6$;TLIP
247   LPRINT TAB(19) "Total Principal & Interest:";USING DCP6$;TPI;
248	'YEAR=YEAR+1
249   LPRINT:LPRINT TAB(20) TIME$,DATE$,CHR$(12)
250 RETURN 'to WrapUp
251 END    'of printer subroutine...
252 '
253 '=================== S U B R O U T I N E S =====================
254 '
255 'OnError:
256    LOCATE 1,30:PRINT "An Error has occured! "
257    LOCATE 2,22:PRINT "Error # is:";ERR,"Error Line is:";ERL
258      IF ERR=25 THEN LOCATE 10,17 'error message OVERPRINTS normal message
259    PRINT"Oops!  You forgot to turn on the printer again.";
260    LOCATE 25,1:PRINT"Press the AnyKey to restart...";
261    KP$=INKEY$:IF KP$="" THEN 261   'pause
262 GOTO 102 'restart with old loan variables
263 '---------------------------------
264 'ClearInputLine&Reset bad.input$:
265    LOCATE ROW,48:PRINT SPC(48);:ROW=0
266    BAD.INPUT$="no"
267    RETURN 'to calling loan data input routine
268 '---------------------------------
269 'ScreenPauser#1:
270    LOCATE 24,1:PRINT "Press the AnyKey to continue...";
271    KP$=INKEY$:IF KP$="" THEN 271 'pause
272 GOTO 5  'Program-Housekeeping&Variables (on error line)
273 '---------------------------------
274 'ScreenPauser#2:
275    LOCATE 24,11
276    PRINT "Year number";YEAR;
277    PRINT TAB(54)"Anykey continues";
278    KP$=INKEY$:IF KP$="" THEN 278 'pause
279    CLS:J=0:I=0
280    IF KP$=CHR$(27) THEN GOTO 165 'WrapUp
281 RETURN
282 '---------------------------------
283 'ScreenPauser#3:
284    KP$=INKEY$:IF KP$="" THEN 284 'pause
285    CLS
286 RETURN
287 '--------------------------------- 	
288 'DoAllTheDateStuffHere:  'leave blank for right now... 
289 '
290 '
291 '
292 '
293 '
294 '
295 '
296 '
297 '
298 '---------------------------------
299 'DataDictionary:
300 '
301 '
302 '
303 '
304 '
305 '
306 '
307 '---------------------------------
308 'EmbeddedCommands:
309 CLS:LIST  0-3  'Main Program (LoanAmortizationProgram)
310 CLS:LIST  3-14  'HouseKeeping
311 CLS:LIST  14-21  'OpeningScreenSplash
312 CLS:LIST  21-41  'Input&CheckRoutine4Interest
313 CLS:LIST  41-61  'Input&CheckRoutine4Principal
314 CLS:LIST  61-81  'Input&CheckRoutine4Term
315 CLS:LIST  81-101 'Input&CheckRoutine4PaymentsPerYear
316 CLS:LIST 101-114 'ConvertMemoryVariables2WorkingVariables
317 CLS:LIST 114-130 'PrintOpeningDataScreen
318 CLS:LIST 130-149 'DoCalcStuff&PrintAmortization
319 CLS:LIST 149-158 'LastPaymentPrintOut
320 CLS:LIST 158-164 'PrintPrincipal&InterestSummation
321 CLS:LIST 164-179 'WrapUp
322 CLS:LIST 180-198 'PrinterOutput-ResetLoanVariablesForRecalc
323 CLS:LIST 198-213 'PrinterOutput-AmortizationHeading&LoanTerms
324 CLS:LIST 213-236 'PrinterOutput-DoCalcStuff&PrintAmortizationLoop
325 CLS:LIST 236-243 'PrinterOutput-LastPaymentPrintout
326 CLS:LIST 243-253 'PrinterOutput-Principal&InterestSummation
327 CLS:LIST 253-263 'OnError
328 CLS:LIST 263-268 'ClearInputLine
329 CLS:LIST 268-273 'ScreenPauser#1
330 CLS:LIST 273-282 'ScreenPauser#2
331 CLS:LIST 282-287 'ScreenPauser#3
332 CLS:LIST 287-298 'DateStuff
333 CLS:LIST 298-307 'DataDictionary
334 CLS:LIST 308-     'EmbeddedCommands
335 LPRINT:LPRINT TAB(20) TIME$,DATE$,CHR$(12)
336 '      save"amortize.bas",a
337 '
338 '      save"amortize.bas",a


TOP Index TOC
Hosted by www.Geocities.ws

1