home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib32b.dsk / INVESTMENT.CALC.bas < prev    next >
BASIC Source File  |  2023-02-26  |  12KB  |  213 lines

  1. 10  REM ************************
  2. 20  REM * INVESTMENT.CALC      *
  3. 30  REM * BY E.L. OSHLO        *
  4. 40  REM * COPYRIGHT (C) 1987   *
  5. 50  REM * BY MICROSPARC, INC.  *
  6. 60  REM * CONCORD, MA  01742   *
  7. 70  REM ************************
  8. 80  ONERR  GOTO 2870
  9. 90  DIM CF(40):D$ =  CHR$(4):SL = 1: REM  PRINTER SLOT
  10. 100  IF  PEEK(48896) = 76  THEN  PRINT D$"PREFIX/"
  11. 110  TEXT : HOME :F$ = "":A$ = ""
  12. 120  PRINT "INVESTMENT CALCULATOR": PRINT "BY E.L. OSHLO": PRINT "COPYRIGHT 1987 BY MICROSPARC, INC.": POKE 34,4
  13. 130  VTAB 5: PRINT "PROGRAM WILL CALCULATE THE INTERNAL RATEOF RETURN OR NET PRESENT OR FUTURE VALUEOF UP TO 40 CASH FLOWS.   CASH FLOWS MAYHAVE UP TO 7 DIGITS (1234.56 OR 1234567)
  14. 140  VTAB 10: PRINT "GET DATA FROM:": PRINT : HTAB 3: INVERSE : PRINT "D";: NORMAL : PRINT "IF FILE ON DISK": PRINT : HTAB 3: INVERSE : PRINT "I";: NORMAL : PRINT "RR CALCULATOR FILE ON DISK"
  15. 150  PRINT : HTAB 3: INVERSE : PRINT "K";: NORMAL : PRINT "EYBOARD": PRINT : HTAB 3: INVERSE : PRINT "Q";: NORMAL : PRINT "UIT PROGRAM"
  16. 160  VTAB 10: HTAB 16: POKE  -16368,0: GET A$: PRINT A$: IF A$ < >"Q"  THEN 190
  17. 170  VTAB 20: CALL  -958: PRINT "ARE YOU SURE? "; CHR$(7);: POKE  -16368,0: GET A$: PRINT A$: IF A$ = "Y"  OR A$ =  CHR$(121)  THEN  POKE 216,0: TEXT : HOME : END 
  18. 180  GOTO 110
  19. 190  IF A$ = "D"  THEN  GOSUB 1940: GOSUB 2170: GOSUB 1190: GOTO 230
  20. 200  IF A$ = "I"  THEN  GOSUB 1940: GOSUB 2020: GOSUB 1190: GOTO 230
  21. 210  IF A$ = "K"  THEN  GOSUB 1440: GOTO 230
  22. 220  PRINT  CHR$(7): GOTO 140
  23. 230  VTAB 23: CALL  -958: INVERSE : PRINT "C";: NORMAL : PRINT "HANGE A CASH FLOW   ";: INVERSE : PRINT "P";: NORMAL : PRINT "ROCEED   ";
  24. 240  INVERSE : PRINT "Q";: NORMAL : PRINT "UIT ";: POKE  -16368,0: GET A$: IF A$ < >"C"  AND A$ < >"P"  AND A$ < >"Q"  THEN  VTAB 22: PRINT  CHR$(7): GOTO 230
  25. 250  IF A$ = "Q"  THEN 580
  26. 260  PRINT : IF A$ = "P"  THEN 320
  27. 270  VTAB 23: CALL  -958: INPUT "CHANGE WHICH CASH FLOW #? ";I$:I =  VAL(I$): IF I$ < >"Q"  AND ((I <1  AND I$ < >"0")  OR I >39)  THEN  VTAB 22: PRINT  CHR$(7): GOTO 270
  28. 280  IF I$ = "Q"  THEN 230
  29. 290  IF I >N  THEN N = I: REM  IF I>N THEN ADDING CASH FLOWS
  30. 300  IF I$ = "0"  THEN  GOSUB 1650: GOTO 230
  31. 310 VT = 8 +I -(13 * INT((I -1)/13)): GOSUB 1580: POKE 34,2: POKE 32,0: GOTO 230
  32. 320  HOME 
  33. 330  IF CF(N) < >0  THEN 350
  34. 340 N = N -1: GOTO 330: REM  TEST TO SEE IF CF LIST WAS SHORTENED
  35. 350  VTAB 7: HTAB 10: PRINT "CALCULATE:": PRINT : HTAB 10: PRINT "NET ";: INVERSE : PRINT "P";: NORMAL : PRINT "RESENT VALUE"
  36. 360  PRINT : HTAB 10: PRINT "NET ";: INVERSE : PRINT "F";: NORMAL : PRINT "UTURE VALUE": PRINT : HTAB 10: INVERSE : PRINT "I";: NORMAL : PRINT "NTERNAL RATE OF RETURN": PRINT : HTAB 10: INVERSE : PRINT "Q";: NORMAL : PRINT "UIT"
  37. 370  VTAB 7: HTAB 21: POKE  -16368,0: GET IR$: PRINT IR$: IF IR$ < >"F"  AND IR$ < >"Q"  AND IR$ < >"P"  AND IR$ < >"I"  THEN  PRINT  CHR$(7): GOTO 370
  38. 380  HOME : IF IR$ = "Q"  THEN 510
  39. 390  IF IR$ = "P"  THEN  PRINT  SPC( 5)"NET PRESENT VALUE CALCULATION"
  40. 400  IF IR$ = "F"  THEN  PRINT  SPC( 5)"NET FUTURE VALUE CALCULATION"
  41. 410  IF IR$ = "I"  THEN  PRINT  SPC( 3);"INTERNAL RATE OF RETURN CALCULATION": VTAB 9: CALL  -868: PRINT "STANDARD OR MODIFIED IRR? (S/M).......";: POKE  -16368,0: GET SM$: PRINT SM$: IF SM$ < >"S"  AND SM$ < >"M"  THEN  PRINT  CHR$(7): HOME : GOTO 410
  42. 420  VTAB 11: CALL  -868: PRINT "END OR MID YEAR DISCOUNTING? (E/M)....";: POKE  -16368,0: GET B$: PRINT B$: IF B$ < >"E"  AND B$ < >"M"  THEN  PRINT  CHR$(7): GOTO 420
  43. 430  IF B$ = "E"  THEN D = 0:M = 0
  44. 440  IF B$ = "M"  THEN D = .5:M = .5
  45. 450  IF N = 1  THEN C$ = "N": GOTO 470
  46. 460  VTAB 13: CALL  -868: PRINT "LAST CF IN SAME YR AS THE ONE BEFORE?.";: POKE  -16368,0: GET C$: PRINT C$: IF C$ < >"Y"  AND C$ < >"N"  THEN  PRINT  CHR$(7): GOTO 460
  47. 470  IF C$ = "Y"  THEN M = 1
  48. 480  IF IR$ < >"I"  THEN  GOSUB 800
  49. 490  IF SM$ = "M"  AND IR$ = "I"  THEN  GOSUB 970
  50. 500  IF SM$ = "S"  AND IR$ = "I"  THEN  GOSUB 620
  51. 510  GOSUB 1190
  52. 520  VTAB 22: CALL  -958: VTAB 23: INVERSE : PRINT "R";: NORMAL : PRINT "E-RUN  ";: INVERSE : PRINT "P";: NORMAL : PRINT "RINT  ";
  53. 530  INVERSE : PRINT "S";: NORMAL : PRINT "AVE  ";: INVERSE : PRINT "N";: NORMAL : PRINT "EW FILE  ";: INVERSE : PRINT "Q";: NORMAL : PRINT "UIT  ";: POKE  -16368,0: GET A$: PRINT A$
  54. 540  IF A$ = "R"  THEN 230
  55. 550  IF A$ = "P"  THEN 1760
  56. 560  IF A$ = "S"  THEN 2600
  57. 570  IF A$ = "N"  THEN  TEXT : RUN 
  58. 580  IF A$ = "Q"  THEN  VTAB 22: CALL  -958: PRINT : PRINT "ARE YOU SURE? "; CHR$(7);: POKE  -16368,0: GET A$: PRINT A$: IF A$ = "Y"  OR A$ =  CHR$(121)  THEN  POKE 216,0: TEXT : HOME : END 
  59. 590  GOTO 520
  60. 600  VTAB 22: PRINT  CHR$(7): GOTO 520
  61. 610  REM  IRR CALCULATION ROUTINE
  62. 620 R = 0: REM  CALCULATION USES THE NEWTON-RAPHSON METHOD
  63. 630  GOSUB 2830
  64. 640 X = CF(0):X1 = 0
  65. 650  IF N = 1  THEN 710
  66. 660  FOR I = 1 TO (N -1)
  67. 670 T = CF(I) * EXP( -(I -D) *R)
  68. 680 X = X +T
  69. 690 X1 = X1 +( -(I -D) *T)
  70. 700  NEXT 
  71. 710 X = X +(CF(N) * EXP( -(N -M) *R))
  72. 720 X1 = X1 -(N -M) *CF(N) * EXP( -(N -M) *R)
  73. 730 R1 = R +( -X/X1)
  74. 740  IF  ABS(R1 -R) <.00005  THEN 770: REM  CALCULATE TO AN ACCURACY OF .005%
  75. 750 R = R1
  76. 760  GOTO 640
  77. 770 R =  INT(( EXP(R) -1) *10000 +.5)
  78. 780  RETURN 
  79. 790  REM   NPV/NFV CALCULATION
  80. 800  IF IR$ = "P"  THEN  VTAB 15: INPUT "NPV DISCOUNT RATE? (%) ";RI$
  81. 810  IF IR$ = "F"  THEN  VTAB 15: INPUT "NFV INTEREST RATE? (%) ";RI$
  82. 820 IR =  VAL(RI$): VTAB 15: HTAB 24: PRINT IR
  83. 830  GOSUB 2830
  84. 840 NR = 1 +IR *.01
  85. 850 X = CF(0)
  86. 860  IF N = 1  THEN 900
  87. 870  FOR I = 1 TO (N -1)
  88. 880 X = X +CF(I)/(NR ^(I -D))
  89. 890  NEXT 
  90. 900 X = X +CF(N)/(NR ^(N -M))
  91. 910  IF IR$ = "F"  THEN X = (X *(NR ^(N -M)))
  92. 920  IF  ABS(X) > = 10000  THEN X$ =  STR$( INT(X +.5)): GOTO 510
  93. 930 XY =  INT( ABS(X) *100 +.5) *.01:WX =  INT(XY):DX =  INT((XY -WX) *100 +.5)
  94. 940 X$ =  STR$(WX) +"." + LEFT$( RIGHT$("0" + STR$(DX),2) +"0",2): IF X <0  THEN X$ = "-" +X$
  95. 950  RETURN 
  96. 960  REM  MODIFIED ROR CALCULATION
  97. 970  VTAB 15: INPUT "NEG CF DISCOUNT RATE? (%) ";RI$:NP =  VAL(RI$): VTAB 15: HTAB 27: PRINT NP
  98. 980  PRINT : INPUT "POS CF DISCOUNT RATE? (%) ";RI$:PP =  VAL(RI$): VTAB 17: HTAB 27: PRINT PP
  99. 990  GOSUB 2830
  100. 1000 NR = 1 +NP *.01:PR = 1 +PP *.01
  101. 1010 R = 0:X = 0:X1 = 0
  102. 1020  IF CF(0) <0  THEN X = CF(0)
  103. 1030  IF CF(0) >0  THEN X1 = CF(0)
  104. 1040 NX = N
  105. 1050  IF C$ = "Y"  THEN NX = NX -1
  106. 1060  IF N = 1  THEN 1110
  107. 1070  FOR I = 1 TO (N -1)
  108. 1080  IF CF(I) <0  THEN X = X +CF(I)/(NR ^(I -D))
  109. 1090  IF CF(I) >0  THEN X1 = X1 +CF(I) *PR ^(NX -I +D)
  110. 1100  NEXT 
  111. 1110  IF CF(N) <0  THEN X = X +CF(N)/NR ^(N -M)
  112. 1120 MX = 0
  113. 1130  IF C$ = "N"  AND B$ = "M"  THEN MX = .5
  114. 1140  IF CF(N) >0  THEN X1 = X1 +CF(N) *PR ^(MX)
  115. 1150 R = (X1/ -X) ^(1/NX) -1
  116. 1160 R =  INT(R *10000 +.5)
  117. 1170  RETURN 
  118. 1180  REM  DISPLAY & PRINTOUT FORMATTER
  119. 1190  HOME : IF F$ < >""  THEN  TEXT : HOME : PRINT  SPC( 16 -( LEN(F$) *.5));: INVERSE : PRINT " FILE: "F$" ": NORMAL : POKE 34,2: HOME 
  120. 1200  IF IR$ < >"I"  THEN L =  LEN( STR$(IR) +X$) *.5
  121. 1210  IF IR$ = "P"  THEN  PRINT  SPC( 7 -L)"NET PRESENT VALUE AT "IR"% = $"X$: GOTO 1270
  122. 1220  IF IR$ = "F"  THEN  PRINT  SPC( 8 -L)"NET FUTURE VALUE AT "IR"% = $"X$: GOTO 1270
  123. 1230  IF S$ < >""  THEN S$ = "": PRINT : PRINT : PRINT : GOTO 1290: REM    SKIP IRR DISPLAY IF DATA FROM DIF FILE IS UNPROCESSED
  124. 1240 R$ =  STR$( INT( ABS(R *.01))) +"." + RIGHT$( STR$(R),2): IF R <0  THEN R$ = "-" +R$
  125. 1250  IF SM$ = "M"  THEN L =  LEN(R$) *.5: PRINT  SPC( 6 -L)"MODIFIED RATE OF RETURN IS "R$"%": GOTO 1270
  126. 1260 L =  LEN(R$) *.5: PRINT  SPC( 6 -L)"INTERNAL RATE OF RETURN IS "R$"%"
  127. 1270  PRINT : IF B$ = "E"  THEN  PRINT  SPC( 6)"END OF YEAR DISCOUNT FACTORS"
  128. 1280  IF B$ = "M"  THEN  PRINT  SPC( 7)"MID YEAR DISCOUNT FACTORS"
  129. 1290 CF = 0
  130. 1300  FOR XX = 0 TO N:CF = CF +CF(XX): NEXT XX:CF =  INT(CF *100 +.5) *.01
  131. 1310 CL =  LEN( STR$(CF)) *.5
  132. 1320  PRINT  SPC( 11 -CL)"CASH FLOWS TOTAL $"CF
  133. 1330  PRINT : PRINT "CF0"; SPC( 9 - LEN( STR$(CF(0))));CF(0)" !CF    --$-- !CF    --$--"
  134. 1340  FOR I = 1 TO 13
  135. 1350 LI =  LEN( STR$(I))
  136. 1360 LCF =  LEN( STR$(CF(I)))
  137. 1370  PRINT "!"I SPC( 11 -LI -LCF)CF(I);
  138. 1380 LCF =  LEN( STR$(CF(I +13)))
  139. 1390  PRINT " !"(I +13) SPC( 9 -LCF)CF(I +13);
  140. 1400 LCF =  LEN( STR$(CF(I +26)))
  141. 1410  PRINT " !"(I +26) SPC( 9 -LCF)CF(I +26)
  142. 1420  NEXT : RETURN 
  143. 1430  REM  KEYBOARD DATA ENTRY
  144. 1440  HOME 
  145. 1450  PRINT  SPC( 2);"ENTER CASH OUTLAYS AS NEGATIVE (-)"
  146. 1460  PRINT  SPC( 2);"ENTER CASH RECEIPTS AS POSITIVE (+)"
  147. 1470  PRINT  SPC( 5);"INITIAL INVESTMENT IS CF(0)": VTAB 15: PRINT  SPC( 8)"(ENTER Q FOR MAIN MENU)": VTAB 7
  148. 1480  INPUT "NUMBER OF CASH FLOWS EXCLUDING CF0? ";NU$:N =  VAL(NU$): IF NU$ = "Q"  THEN 110
  149. 1490  IF N <1  OR N >39  THEN  VTAB 14: CALL  -958: PRINT  CHR$(7)"NUMBER OF CASH FLOWS MUST BE": PRINT "BETWEEN 1 AND 39 EXCLUDING CF0": PRINT : PRINT "PRESS RETURN TO CONTINUE": GOSUB 2840: GOTO 1440
  150. 1500  GOSUB 1690
  151. 1510  GOSUB 1650
  152. 1520  PRINT : VTAB 23: PRINT " PRESS " CHR$(34)"S" CHR$(34)" FOR SAME AS PRIOR CASH FLOW"
  153. 1530  FOR I = 1 TO N
  154. 1540 VT = 8 +I -(13 * INT((I -1)/13)): GOSUB 1580
  155. 1550  NEXT : POKE 34,2: POKE 32,0
  156. 1560  RETURN 
  157. 1570  REM  CASH FLOW ENTRY & EDIT
  158. 1580  POKE 33,9: POKE 34,VT -1: POKE 35,VT
  159. 1590  POKE 32,(4 +13 *( INT((I -1)/13))): GOTO 1600
  160. 1600  HOME : INPUT "";CF$: IF CF$ < >"S"  THEN CF(I) =  VAL(CF$): IF  LEN( STR$( ABS(CF(I)))) >7  THEN  PRINT  CHR$(7): GOTO 1600
  161. 1610  IF CF$ = "S"  THEN CF(I) = CF(I -1)
  162. 1620  HOME : POKE 33,40: POKE 35,24: PRINT  SPC( 8 - LEN( STR$(CF(I))))CF(I)
  163. 1630  RETURN 
  164. 1640  REM  CF(0) ENTRY & EDIT
  165. 1650  POKE 33,9: POKE 32,4: POKE 34,7: POKE 35,8: HOME : INPUT "";CF$:CF(0) =  VAL(CF$): IF  LEN( STR$( ABS(CF(0)))) >7  THEN  PRINT  CHR$(7): GOTO 1510
  166. 1660  IF CF(0) >0  THEN  PRINT  CHR$(7);: GOTO 1650
  167. 1670  HOME : POKE 32,0: POKE 33,40: POKE 34,2: POKE 35,24: PRINT  SPC( 8 - LEN( STR$(CF(0))))CF(0): RETURN 
  168. 1680  REM  DATA ENTRY FORM
  169. 1690  VTAB 8: CALL  -958: PRINT "CF0" SPC( 9)" !CF    --$-- !CF    --$--"
  170. 1700  FOR I = 1 TO 13
  171. 1710 LI =  LEN( STR$(I))
  172. 1720  PRINT "!"I SPC( 12 -LI)"!"(I +13) SPC( 10)"!"(I +26) SPC( 11)
  173. 1730  NEXT 
  174. 1740  RETURN 
  175. 1750  REM  PRINTER ROUTINE
  176. 1760  VTAB 23: CALL  -958: PRINT "WANT A TITLE? ";: POKE  -16368,0: GET A$: IF A$ < >"Y"  AND A$ < >"N"  THEN  PRINT  CHR$(7): GOTO 1760
  177. 1770  PRINT A$: IF A$ = "N"  THEN TI$ = "": GOTO 1800
  178. 1780  POKE 34,22: VTAB 23: CALL  -958: INPUT "TITLE: ";TI$: VTAB 22: CALL  -958: POKE 34,2
  179. 1790 TI =  LEN(TI$) *.5: IF TI >20  THEN TI = 20
  180. 1800  PRINT D$;"PR#"SL
  181. 1810  PRINT  CHR$(9);"80N"
  182. 1820  IF TI$ = ""  THEN TI$ = "INTERNAL RATE OF RETURN CALCULATOR":TI = 17
  183. 1830  PRINT : PRINT  SPC( 20 -TI)TI$
  184. 1840  PRINT 
  185. 1850  GOSUB 1200
  186. 1860  IF SM$ = "M"  AND IR$ = "I"  THEN  PRINT : PRINT "MODIFIED RATE OF RETURN DISCOUNT FACTORS:": PRINT "NEGATIVE CASH FLOWS: ";NP;"%": PRINT "POSITIVE CASH FLOWS: ";PP;"%"
  187. 1870  PRINT : PRINT 
  188. 1880  IF C$ = "Y"  THEN  PRINT "CASH FLOW ";N;" IS AT END OF PERIOD ";(N -1): GOTO 1910
  189. 1890  PRINT "CASH FLOW ";N;" IS IN PERIOD ";N
  190. 1900  IF F$ < >""  THEN  PRINT : PRINT "FILE NAME: "F$
  191. 1910  FOR I = 1 TO 6: PRINT : NEXT 
  192. 1920  PRINT D$"PR#0": GOTO 520
  193. 1930  REM  INPUT FILE NAME AND DRIVE
  194. 1940  VTAB 19: CALL  -958
  195. 1950  VTAB 23: PRINT  SPC( 10)"(?=CATALOG, Q=QUIT)"
  196. 1960  VTAB 20: INPUT "FILE NAME? ";F$: IF F$ = "Q"  THEN  POP : GOTO 110
  197. 1970  VTAB 22: CALL  -958: INPUT "DRIVE NO.: ";ND$: IF ND$ = "Q"  THEN  POP : GOTO 110
  198. 1980 ND =  VAL( RIGHT$(ND$,1)): IF ND <1  OR ND >2  THEN  PRINT  CHR$(7): GOTO 1970
  199. 1990  IF F$ = "?"  THEN  HOME : PRINT D$ LEFT$("CATALOG",7 -4 *( PEEK(48896) = 76))",D"ND: GOSUB 2840: POP : GOTO 110
  200. 2000  RETURN 
  201. 2010  REM   READ IRR CALCULATOR FILE
  202. 2020  PRINT D$"VERIFY"F$",D"ND:DD = 0
  203. 2030  PRINT D$"OPEN"F$
  204. 2040  PRINT D$"READ"F$
  205. 2050  INPUT TE$: IF TE$ = "IRR"  THEN 2080
  206. 2060  VTAB 21: CALL  -868: PRINT  CHR$(7)F$" IS NOT AN IRR CALCULATOR FILE"
  207. 2070  PRINT D$"CLOSE": GOTO 1960
  208. 2080  INPUT N
  209. 2090  FOR I = 0 TO N: INPUT CF(I): NEXT 
  210. 2100  INPUT IR$: REM  IS STORED DATA FOR IRR OR NPV
  211. 2110  IF IR$ = "I"  THEN  INPUT R: INPUT SM$: GOTO 2130
  212. 3857 <CTRL-C>