|
- 10 REM ************ RECURSIVE BUDGETING *****************
- 20 REM
- 30 REM by O.E. Dial
- 40 REM
- 50 REM Ref. 'PERSONAL COMPUTING' May/June 1977
- 60 REM pgs. 54-59
- 70 REM
- 80 REM --------------------------------------------------
- 90 REM
- 100 Q=27: V$="###.#" : W$="$$#####," : U$="###"
- 110 CL$=CHR$(27)+CHR$(69):REM Screen clear
- 120 DIM D(18),E$(Q),V(Q),F(Q)
- 130 PRINT CL$;
- 140 PRINT TAB(19);"RECURSIVE BUDGETING MODEL": PRINT: PRINT TAB(28);"* * *"
- 150 PRINT CL$;
- 160 DATA SALARY/WAGES,OTHER INCOME,FED INC TAX,STATE AND LOCAL TAX
- 170 DATA SOCIAL SECURITY,UNEMPLOYMENT INS,HEALTH INS
- 180 DATA LIFE INS,CONTRIBUTIONS,OTHER DEDUCTIONS
- 190 DATA RENT/MORTGAGE,LIFE INS, HEALTH INS, HOUSE INS
- 200 DATA AUTO INS,CAR PAYMENTS,LOAN PAYMENTS,TRASH REMOVAL
- 210 DATA OTHER FIXED EXP
- 220 DATA FOOD/BEVERAGES,CLOTHING,DRY CLEANING,BARBER/BEAUTY
- 230 DATA HOME MAINT,"HOME HEAT'G FUEL",WATER,ELECTRICITY,TELEPHONE
- 240 DATA GAS/OIL,AUTO MAINT,FARES/TOLLS/PARKING,DENTIST
- 250 DATA PHYSICIAN,DRUGS/SUNDRIES,SCHOOL EXPENSE,FAMILY ALLOWANCE
- 260 DATA CLUBS/LODGES,THEATER/SPORTS,RESTAURANTS
- 270 DATA "OTHER ENT'MENT","MAG'S/BOOKS/PAPERS",SITTERS,CHILD CARE
- 280 DATA VACATION SAVINGS,OTHER SAVINGS,CONTRIBUTIONS,OTHER EXPENSES
- 290 REM
- 300 REM
- 310 PRINT: PRINT"Select your budgeting period by number. Later on it will"
- 320 PRINT"be extended to one year.": PRINT
- 330 PRINT TAB(10);"1-WEEKLY"
- 340 PRINT TAB(10);"2-BIWEEKLY"
- 350 PRINT TAB(10);"3-SEMIMONTHLY"
- 360 PRINT TAB(10);"4-MONTHLY"
- 370 PRINT
- 380 INPUT": ",P
- 390 IF P>4 THEN PRINT"Try again!" ELSE 410
- 400 GOTO 310
- 410 IF P=1 THEN P=52
- 420 IF P=2 THEN P=26
- 430 IF P=3 THEN P=24
- 440 IF P=4 THEN P=12
- 450 PRINT CL$;
- 460 PRINT:PRINT"Alright, first let's look at income for the period."
- 470 PRINT
- 480 READ A$:PRINT A$;" $";: INPUT"",D(0):READ A$:PRINT A$;" $";:INPUT"",D(1)
- 490 TI=D(0)+D(1)
- 500 PRINT CL$;
- 510 PRINT:PRINT"Ok, now let's look at paycheck deductions.":PRINT
- 520 FOR J=2 TO 9: READ A$: PRINT A$;" $";:INPUT"",D(J):TD=TD+D(J): NEXT J
- 530 PRINT CL$;
- 540 PRINT"Ok, now let's look at fixed expenses.": PRINT
- 550 FOR J=10 TO 18:READ A$:PRINT A$;" $";:INPUT"",D(J):TF=TF+D(J): NEXT J
- 560 DF=TD+TF: SI=TI-DF: S=64
- 570 PRINT CL$;
- 580 PRINT"Ok, at this point our table looks like this: ": PRINT
- 590 PRINT
- 600 GOSUB 2110: PRINT: PRINT TAB(19);
- 610 PRINT"RECURSIVE BUDGETING MODEL": PRINT: PRINT TAB(27);"* * *": PRINT
- 620 GOSUB 2110
- 630 PRINT:PRINT TAB(20);"SPENDABLE INCOME SUMMARY": PRINT
- 640 GOSUB 2100: PRINT TAB(3);"ACCOUNT";TAB(42);"PERIOD";TAB(57);"ANNUAL"
- 650 GOSUB 2100: PRINT"TOTAL INCOME";TAB(40);
- 660 PRINT USING W$;TI;:PRINT TAB(55);
- 670 PRINT USING W$;TI*P: PRINT:PRINT TAB(3);"PAYCHECK DEDUCTIONS";TAB(25);
- 680 PRINT USING W$;TD*(-1): PRINT
- 690 PRINT TAB(3);"FIXED EXPENSES";TAB(25);: PRINT USING W$;TF*(-1);
- 700 PRINT TAB(40);: PRINT USING W$;DF*(-1);: PRINT TAB(55);
- 710 PRINT USING W$;DF*(-1)*P
- 720 PRINT TAB(41);"-------";TAB(55);"--------":PRINT"SPENDABLE INCOME";
- 730 PRINT TAB(40);:PRINT USING W$;SI;:PRINT TAB(55);:PRINT USING W$;SI*P
- 740 PRINT TAB(41);"========";TAB(55);"========":PRINT:
- 750 GOSUB 2110: PRINT: PRINT
- 760 GOSUB 2120
- 770 RO=0
- 780 PRINT:PRINT"Ok, now for the first round of variable expense. Don't"
- 790 PRINT"pinch yourself in your estimates (within reason). Let the"
- 800 PRINT"computer help you to refine your budget later on.": PRINT
- 810 FOR J=0 TO Q:READ E$(J):PRINT E$(J);" $";: INPUT"",V(J):VT=VT+V(J):NEXT J
- 820 RESTORE
- 830 PRINT:PRINT
- 840 PRINT"Your budget for the first round totalled $";VT;". This"
- 850 PRINT"compares to spendable income of $";SI;". We have"
- 860 PRINT"prorated the difference, $";SI-VT;", over all variable expense"
- 870 PRINT"accounts.": PRINT
- 880 GOSUB 2120: FOR J=0 TO Q:V(J)=INT(V(J)/VT*SI): NEXT J: VT=SI: PRINT
- 890 PRINT CL$;
- 900 PRINT"Now we begin the budget refinement phase. Make as many"
- 910 PRINT"passes as you like. As you review each account, decide"
- 920 PRINT"whether to FREEZE it or leave it for another pass.": PRINT
- 930 PRINT"HINT: Don't be in a hurry to freeze an account.": PRINT
- 940 PRINT"Your task is finished when all accounts are frozen!": PRINT
- 950 GOSUB 2120
- 960 FOR J=0 TO Q: IF V(J)=0 THEN 1180
- 970 PRINT
- 980 PRINT E$(J);" $";V(J): INPUT"Change ('Y' or 'N') ",A$
- 990 A$=LEFT$(A$,1)
- 1000 IF A$="N" THEN 1030 ELSE IF A$="Y" THEN 1010 ELSE 980
- 1010 INPUT"Revised amount $";A: IF A<V(J) THEN 1030
- 1020 GOSUB 2150
- 1030 INPUT"Freeze ('Y' or 'N') ",B$
- 1040 B$=LEFT$(B$,1)
- 1050 IF A$="Y" AND B$="Y" THEN 1100
- 1060 IF A$="Y" AND B$="N" THEN 1140
- 1070 IF A$="N" AND B$="N" THEN 1180
- 1080 VT=VT-V(J): FT=FT+V(J): U=F(J):F(J)=V(J):V(J)=U: V(J)=0: PRINT
- 1090 PRINT"Ok, the account has been frozen at $";F(J);".": GOTO 1180
- 1100 VT=VT-A: FT=FT+A: U=A:A=F(J):F(J)=U: V(J)=0
- 1110 FOR K=0 TO Q: V(K)=INT(V(K)*(SI-FT)/VT): NEXT K: VT=SI-FT
- 1120 PRINT"Ok, the account has been frozen at $";F(J);", and the difference"
- 1130 PRINT"prorated over the remaining accounts.": PRINT: GOTO 1180
- 1140 VT=VT-V(J)+A: V(J)=A
- 1150 FOR K=0 TO Q:V(K)=INT(V(K)*(SI-FT)/VT): NEXT K: VT=SI-FT
- 1160 PRINT"Ok, the value has been changed to $";A;", and the difference"
- 1170 PRINT"prorated over remaining accounts.": PRINT
- 1180 NEXT J: R=0: FOR J=0 TO Q: IF V(J)=0 THEN R=R+1
- 1185 NEXT J
- 1190 IF R<=Q THEN 1210
- 1200 FOR J=0 TO Q: F(J)=INT(F(J)/FT*SI): NEXT J: VT=0: FT=SI: GOTO 1580
- 1210 PRINT"Now, let's recap variable expenses before going on to the"
- 1220 PRINT"next round.": PRINT: RO=RO+1: V1=0: F1=0
- 1230 FOR J=0 TO Q: V(J)=INT(V(J)/VT*(SI-FT)): NEXT J: VT=SI-FT
- 1240 GOSUB 2120
- 1250 PRINT TAB(7);"INTERIM SUMMARY OF VARIABLE EXPENSES";
- 1260 PRINT": NO.";RO
- 1270 GOSUB 2100: PRINT TAB(3);"ACCOUNTS";TAB(28);"NUMBER";TAB(37);"PERCENT";
- 1280 PRINT TAB(48);"AMOUNT";TAB(56);"PERCENT"
- 1290 GOSUB 2100: FOR J=0 TO Q: IF V(J)+F(J)=0 THEN 1310
- 1300 IF V(J) THEN V1=V1+1 ELSE F1=F1+1
- 1310 NEXT J
- 1320 PRINT"VARIABLE EXPENSES";TAB(29);:PRINT USING U$;V1;:PRINT TAB(39);
- 1330 PRINT USING V$;V1/(V1+F1)*100;:PRINT TAB(46);:PRINT USING W$;VT;
- 1340 PRINT TAB(58);:PRINT USING V$;VT/TI*100: PRINT
- 1350 PRINT"FROZEN EXPENSES";TAB(29);:PRINT USING U$;F1;:PRINT TAB(39);
- 1360 PRINT USING V$;F1/(V1+F1)*100;: PRINT TAB(46);
- 1370 PRINT USING W$;FT;: PRINT TAB(58);:PRINT USING V$;FT/TI*100
- 1380 PRINT TAB(28);"-------";TAB(48);"--------"
- 1390 PRINT TAB(3);"TOTALS";TAB(29);:PRINT USING U$;F1+V1;: PRINT TAB(46);
- 1400 PRINT USING W$;VT+FT:PRINT TAB(28);"=======";TAB(48);"========":PRINT
- 1410 GOSUB 2110: PRINT: PRINT
- 1420 GOSUB 1430: GOTO 1470
- 1430 PRINT TAB(8);"INTERIM STATUS OF VARIABLE EXPENSES NO.";RO
- 1440 GOSUB 2100:PRINT TAB(3);"ACCOUNT";TAB(30);"VARIABLE";TAB(43);"FROZEN";
- 1450 PRINT TAB(54);"PERCENT"
- 1460 GOSUB 2100: PRINT
- 1470 FOR J=0 TO Q: IF V(J)+F(J)=0 THEN 1530 ELSE PRINT E$(J);: R2=R2+1
- 1480 IF F(J) THEN 1500 ELSE PRINT TAB(29): PRINT USING W$;V(J);:PRINT TAB(55);
- 1490 PRINT USING V$;V(J)/TI*100: GOTO 1520
- 1500 PRINT TAB(40);: PRINT USING W$;F(J);: PRINT TAB(55);
- 1510 PRINT USING V$;F(J)/TI*100
- 1520 IF INT(R2/5)=R2/5 THEN PRINT
- 1530 NEXT J: PRINT: R2=0
- 1540 GOSUB 2110: PRINT
- 1550 PRINT: PRINT:
- 1560 PRINT"Now we make another pass through variable expenses.":PRINT
- 1570 GOTO 950
- 1580 PRINT:PRINT:PRINT"Please enter the requested information before we ";
- 1590 PRINT"provide a final detail of your budget.": PRINT
- 1600 PRINT TAB(18);"* DON'T use commas or colons *":PRINT
- 1610 INPUT"Name: ",A$: INPUT"Budget year: ",A
- 1620 B=LEN(A$): B=16-B/2
- 1630 PRINT: PRINT
- 1640 GOSUB 2130
- 1650 GOSUB 2110: PRINT
- 1660 PRINT
- 1670 PRINT TAB(B);"* THE ";A$;" FAMILY BUDGET FOR ";A;" *":PRINT
- 1680 GOSUB 2110: PRINT
- 1690 PRINT TAB(6);"ACCOUNT";TAB(20);"|";TAB(26);"INCOME";TAB(38);"|";
- 1700 PRINT TAB(44);"EXPENSE";TAB(56);"|PERCENT"
- 1710 PRINT TAB(20); "|-----------------|-----------------| TOTAL"
- 1720 PRINT TAB(20); "| PERIOD | ANNUAL | PERIOD | ANNUAL |INCOME"
- 1730 PRINT "-------------------|--------|--------|--------|--------|-------"
- 1740 X$= "|$$#####,|$$#####,| | | ###.#"
- 1750 Y$= "| | |$$#####,|$$#####,| ###.#"
- 1760 GOTO 1780
- 1770 PRINT "| | | | |": RETURN
- 1780 PRINT"INCOME";TAB(20);:PRINT USING X$;TI;TI*P;TI/TI*100
- 1790 PRINT"------";TAB(20);
- 1800 GOSUB 1770
- 1810 READ A$:PRINT A$;TAB(20);:PRINT USING X$;D(0);D(0)*P;D(0)/TI*100
- 1820 READ A$:PRINT A$;TAB(20);:PRINT USING X$;D(1);D(1)*P;D(1)/TI*100
- 1830 PRINT TAB(20);
- 1840 GOSUB 1770
- 1850 PRINT"PAYCHECK DEDUCT'S";TAB(20);
- 1860 PRINT USING Y$;TD;TD*P;TD/TI*100
- 1870 PRINT "-----------------";TAB(20);
- 1880 GOSUB 1770
- 1890 FOR J=2 TO 9: READ A$: IF D(J)=0 THEN 1910 ELSE PRINT A$;TAB(20);
- 1900 PRINT USING Y$;D(J);D(J)*P;D(J)/TI*100
- 1910 NEXT J: PRINT TAB(20);
- 1920 GOSUB 1770
- 1930 PRINT"FIXED EXPENSES";TAB(20);
- 1940 PRINT USING Y$;TF;TF*P;TF/TI*100
- 1950 PRINT "--------------";TAB(20);
- 1960 GOSUB 1770
- 1970 FOR J=10 TO 18: READ A$: IF D(J)=0 THEN 1990 ELSE PRINT A$;TAB(20);
- 1980 PRINT USING Y$;D(J);D(J)*P;D(J)/TI*100
- 1990 NEXT J: PRINT TAB(20);
- 2000 GOSUB 1770
- 2010 PRINT"VARIABLE EXPENSE";TAB(20);
- 2020 PRINT USING Y$;FT;FT*P;FT/TI*100
- 2030 PRINT "----------------";TAB(20);
- 2040 GOSUB 1770
- 2050 FOR J=0 TO Q: IF F(J)=0 THEN 2070 ELSE PRINT E$(J);TAB(20);
- 2060 PRINT USING Y$;F(J);F(J)*P;F(J)/TI*100
- 2070 NEXT J: PRINT
- 2080 GOSUB 2110: PRINT
- 2090 GOSUB 2110: PRINT: GOTO 2200
- 2100 FOR L=1 TO S:PRINT"-";:NEXT L: PRINT: RETURN
- 2110 FOR L=1 TO S:PRINT"=";:NEXT L: PRINT: RETURN
- 2120 PRINT"PRESS 'RETURN' TO CONTINUE":INPUT"",A$
- 2130 PRINT CL$;
- 2140 RETURN
- 2150 IF A<=V(J) THEN 2190
- 2160 IF A<=VT THEN 2190
- 2170 PRINT"* You have exceeded your balance of spendable income by $";A-SI;
- 2180 PRINT" *": INPUT"Revised amount $",A: PRINT
- 2190 RETURN
- 2200 RESTORE: READ A$:READ A$:PRINT: S=79
- 2210 PRINT TAB(21);"* EXPENSE BAR CHART *"
- 2220 PRINT TAB(20);"PERCENT OF TOTAL INCOME":PRINT
- 2230 GOSUB 2100: PRINT
- 2240 GOSUB 2380: PRINT
- 2250 FOR J=2 TO 18: READ A$:IF D(J)=0 THEN 2280
- 2260 A=INT((D(J)/TI*100)+.5): PRINT A$;
- 2270 GOSUB 2420
- 2280 NEXT J
- 2290 FOR J=0 TO Q
- 2300 IF F(J)=0 THEN 2330
- 2310 A=INT((F(J)/TI*100)+.5): PRINT E$(J);
- 2320 GOSUB 2420
- 2330 NEXT J: PRINT
- 2340 GOSUB 2380: PRINT: PRINT
- 2350 GOSUB 2110:PRINT:PRINT: GOTO 2490
- 2360 REM
- 2370 GOTO 2490
- 2380 REM
- 2390 PRINT TAB(20);" ....|....1....|....2....|....3....|....4....|....5";
- 2400 PRINT"....|....6"
- 2410 RETURN
- 2420 IF A<1 THEN PRINT TAB(21);"]": GOTO 2450
- 2430 IF A>60 THEN A=60
- 2440 PRINT TAB(21);:FOR K=1 TO A: PRINT"]";:NEXT K: PRINT
- 2450 RETURN
- 2460 REM
- 2470 GOTO 2490
- 2480 REM
- 2490 PRINT: PRINT:
- 2500 END
- 3000 REM -------
- REM
- REM 1080 SWAP F(J),V(J) -> U=F(J):F(J)=V(J):V(J)=U
- REM 1100 SWAP A,F(J) -> U=A:A=F(J):F(J)=U
- REM Added semicolons as PRINT seperators
- REM Quoted text containing apostophes in DATA statements
- REM 1180 IF V(J)=0 THEN R=R+1: NEXT J -> NEXT J moved to 1185
- END
|