```          FLORIDA HIGH SCHOOLS COMPUTING COMPETITION '88
BASIC PROGRAM SOLUTIONS

'1.1
' This program clears the screen and prints a phrase
'
CLS
FOR I = 1 TO 10
PRINT "THE BEST COMPUTER CONTEST!"
NEXT I

'1.2
' This program determines if a given input is integer or real.
'
INPUT "Enter #:"; NUM
IF NUM = INT(NUM) THEN PRINT "INTEGER" ELSE PRINT "REAL"

'1.3
' This program calculates the number of bytes on N diskettes.
'
INPUT "Enter N: "; N
PRINT N * 40 * 8 * 512

'1.4
' This program prints the computer component missing.
'
INPUT "Enter component:"; A\$
INPUT "Enter component:"; B\$
INPUT "Enter component:"; C\$
INPUT "Enter component:"; D\$
DATA CPU,PRIMARY,SECONDARY,INPUT,OUTPUT
FOR I = 1 TO 5
IF NOT (A\$ = E\$ OR B\$ = E\$ OR C\$ = E\$ OR D\$ = E\$) THEN
PRINT E\$: END
END IF
NEXT I

'1.5
' This program displays 4 rectangles of asterisks with #s.
'
CLS
FOR I = 1 TO 79: PRINT "*"; : NEXT I
FOR I = 2 TO 23
LOCATE I, 1: PRINT "*"
LOCATE I, 40: PRINT "*"
LOCATE I, 79: PRINT "*"
NEXT I
LOCATE 12, 1: FOR I = 1 TO 79: PRINT "*"; : NEXT I
LOCATE 24, 1: FOR I = 1 TO 79: PRINT "*"; : NEXT I
' Place numbers in center of rectangles
LOCATE 6, 20: PRINT 1
LOCATE 6, 60: PRINT 2
LOCATE 18, 20: PRINT 3
LOCATE 18, 60: PRINT 4

'1.6
' This program displays the acronym for a given set of words.
'
INPUT "Enter words:"; A\$
PRINT MID\$(A\$, 1, 1);
FOR I = 2 TO LEN(A\$)
MD\$ = MID\$(A\$, I, 1)
IF MD\$ = " " THEN PRINT MID\$(A\$, I + 1, 1); : I = I + 1
NEXT I

'1.7
' This program will display 3 computer names in order of size.
'
INPUT "Enter name:"; N1\$
INPUT "Enter type:"; T1\$
INPUT "Enter name:"; N2\$
INPUT "Enter type:"; T2\$
INPUT "Enter name:"; N3\$
INPUT "Enter type:"; T3\$
IF T1\$ = "MICRO" THEN PRINT N1\$
IF T2\$ = "MICRO" THEN PRINT N2\$
IF T3\$ = "MICRO" THEN PRINT N3\$
IF T1\$ = "MINI" THEN PRINT N1\$
IF T2\$ = "MINI" THEN PRINT N2\$
IF T3\$ = "MINI" THEN PRINT N3\$
IF T1\$ = "MAINFRAME" THEN PRINT N1\$
IF T2\$ = "MAINFRAME" THEN PRINT N2\$
IF T3\$ = "MAINFRAME" THEN PRINT N3\$

'1.8
' This program will count the number of cans to be stacked.
'
INPUT "Enter N: "; N
FOR I = N TO 1 STEP -2
SUM = SUM + I
NEXT I
PRINT SUM

'1.9
' This program simulates a queue w/options: ADD, TAKE, QUIT.
'
INPUT "Enter command:"; IN\$
WHILE IN\$ <> "QUIT"
MAX = MAX + 1: INPUT "Enter integer:"; A(MAX)
ELSE
IF IN\$ = "TAKE" THEN
MIN = MIN + 1: PRINT A(MIN)
END IF
END IF
INPUT "Enter command:"; IN\$
WEND

'1.10
' This program determines events of history between dates.
'
DATA 1801,"JOSEPH JACQUARD","PUNCHCARD AND WEAVING LOOM"
DATA 1830,"CHARLES BABBAGE","DESIGN OF ANALYTIC ENGINE"
DATA 1890,"HERMAN HOLLERITH","PUNCHCARD TABULATING MACHINE"
DATA 1944,"HOWARD AIKEN","MARK I"
DATA 1946,"ECKERT AND MAUCHLY","ENIAC"
DATA 1949,"VON NEUMAN","EDVAC"
'
INPUT "Enter years: "; Y1, Y2
FOR I = 1 TO 7
IF Y1 <= DAT AND DAT <= Y2 THEN PRINT NAM\$; " INVENTED "; INV\$
NEXT I

'2.1
' This program displays a solid diamond of asterisks.
'
INPUT "Enter N: "; N
FOR I = 1 TO N STEP 2
PRINT SPACE\$((N - I) / 2);
FOR J = 1 TO I: PRINT "*"; : NEXT J: PRINT
NEXT I
'
FOR I = N - 2 TO 1 STEP -2
PRINT SPACE\$((N - I) / 2);
FOR J = 1 TO I: PRINT "*"; : NEXT J: PRINT
NEXT I

'2.2
' This program determines the efficiency order of 3 sorts.
'
INPUT "Enter N: "; N
B = N * (N - 1) / 2: B\$ = "BUBBLE SORT"
S = N * (LOG(N) / LOG(2)) ^ 2: S\$ = "SHELL SORT"
Q = N * (LOG(N) / LOG(2)): Q\$ = "QUICK SORT"
'
IF B < S AND B < Q THEN
PRINT B\$
IF S < Q THEN PRINT S\$ ELSE PRINT Q\$
IF S < Q THEN PRINT Q\$ ELSE PRINT S\$
END
ELSE
IF S < Q THEN
PRINT S\$
IF B < Q THEN PRINT B\$ ELSE PRINT Q\$
IF B < Q THEN PRINT Q\$ ELSE PRINT B\$
END
ELSE
PRINT Q\$
IF B < S THEN PRINT B\$ ELSE PRINT S\$
IF B < S THEN PRINT S\$ ELSE PRINT B\$
END IF
END IF

'2.3
' This program determines the number of people in a group.
'
DEFINT A-Z
DIV(1) = 2: RE(1) = 1
DIV(2) = 3: RE(2) = 2
DIV(3) = 5: RE(3) = 1
DIV(4) = 7: RE(4) = 2
'
FOR NUM = 1 TO 200
GOOD = -1
FOR I = 1 TO 4
IF NUM MOD DIV(I) <> RE(I) THEN GOOD = 0
NEXT I
IF GOOD THEN PRINT NUM: END
NEXT NUM

'2.4
' This program generates 5 random numbers between 0 and 9999.
'
INPUT "Enter seed:"; SEED
FOR I = 1 TO 5
PROD# = SEED * SEED
PROD\$ = MID\$(STR\$(PROD#), 2)
DIGITS = LEN(PROD\$)
IF DIGITS < 8 THEN
'   **** Pad 0's to make 8 digit # ****
FOR J = 1 TO 8 - DIGITS
PROD\$ = PROD\$ + "0"
NEXT J
END IF
'
SEED = VAL(MID\$(PROD\$, 3, 4))
PRINT SEED
NEXT I

'2.5
' This program checks to see if data trasmitted is Correct.
'
INPUT "Enter bits:"; BIT\$
INPUT "Enter parity:"; PAR\$
IF LEN(BIT\$) <> 8 THEN PRINT "ERROR": END
FOR I = 1 TO 8
MD\$ = MID\$(BIT\$, I, 1)
IF MD\$ <> "0" AND MD\$ <> "1" THEN PRINT "ERROR": END
SUM = SUM + VAL(MD\$)
NEXT I
' ERROR if even but odd parity;  or if odd but even parity
IF SUM MOD 2 = 0 AND PAR\$ <> "EVEN" THEN PRINT "ERROR": END
IF SUM MOD 2 = 1 AND PAR\$ <> "ODD" THEN PRINT "ERROR": END
PRINT "CORRECT"

'2.6
' This program will calculate the area of a polygon.
'
INPUT "Enter n: "; N
FOR I = 1 TO N
INPUT "Enter vertex: "; X(I), Y(I)
NEXT I
'
X(N + 1) = X(1): Y(N + 1) = Y(1)
FOR I = 1 TO N
SUM = SUM + X(I) * Y(I + 1) - Y(I) * X(I + 1)
NEXT I
PRINT USING "AREA = ##.#"; ABS(SUM) / 2

'2.7
' This program displays the date before/after a given date.
'
INPUT "Enter month, day, year: "; MONTH, DAY, YEAR
DIM MO(12)
FOR I = 1 TO 12: READ MO(I): NEXT I
DATA 31,28,31,30,31,30,31,31,30,31,30,31
'
D1 = DAY - 1: D2 = DAY + 1: M1 = MONTH: M2 = MONTH
Y1 = YEAR: Y2 = YEAR
IF Y1 MOD 4 = 0 AND Y1 MOD 100 > 0 THEN LEAP = -1
IF LEAP AND M1 = 3 AND D1 = 0 THEN LEAP1 = 1
IF LEAP AND M2 = 2 AND D2 = 29 THEN LEAP2 = 1
'
IF D1 = 0 THEN
M1 = M1 - 1
IF M1 > 0 THEN D1 = MO(M1) + LEAP1
IF M1 = 0 THEN M1 = 12: D1 = MO(M1): Y1 = Y1 - 1
ELSE
IF D2 > MO(M2) + LEAP2 THEN
M2 = M2 + 1: D2 = 1
IF M2 > 12 THEN M2 = 1: Y2 = Y2 + 1
END IF
END IF
'
PRINT LTRIM\$(STR\$(M1));
PRINT "-"; LTRIM\$(STR\$(D1)); "-"; LTRIM\$(STR\$(Y1))
PRINT LTRIM\$(STR\$(M2));
PRINT "-"; LTRIM\$(STR\$(D2)); "-"; LTRIM\$(STR\$(Y2))

'2.8
' This program displays a student's Cumulative G. P. Ave.
'
SEM = 1
WHILE SEM <= 8
TOTAL = 0: HRSTOT = 0
FOR I = 1 TO 4
INPUT "Enter grade, credits:"; GR\$, HRS
POYNTS = 4 - (ASC(GR\$) - 65)      'A=4 B=3 C=2 D=1 F=-1
IF POYNTS = -1 THEN POYNTS = 0    'F=-1 becomes F=0
TOTAL = TOTAL + POYNTS * HRS
HRSTOT = HRSTOT + HRS
NEXT I
'
GPA = TOTAL / HRSTOT
PRINT USING " GPA= #.###"; GPA
CUMTOTAL = CUMTOTAL + TOTAL: CUMHRS = CUMHRS + HRSTOT
CGPA = CUMTOTAL / CUMHRS
PRINT USING "CGPA= #.###"; CGPA
IF CGPA < 1 THEN DIS = -1
IF CGPA < 2 AND LASTCGPA < 2 AND SEM > 1 THEN DIS = -1
IF DIS THEN PRINT "STUDENT IS DISMISSED": END
LASTCGPA = CGPA
SEM = SEM + 1
WEND

'2.9
' This program displays 2 elements that form a battery.
'
DATA "LITHIUM ",+3.05
DATA "SODIUM  ",+2.71
DATA "ZINC    ",+0.76
DATA "IRON    ",+0.44
DATA "TIN     ",+0.14
DATA "IODINE  ",-0.54
DATA "SILVER  ",-0.80
DATA "MERCURY ",-0.85
DATA "BROMINE ",-1.09
DATA "CHLORINE",-1.36
FOR I = 1 TO 10: READ ELEM\$(I), POT(I): NEXT I
'
INPUT "Enter Desired Voltage, Tolerance: "; VOLT, TOL
'
FOR I = 1 TO 10
FOR J = 1 TO 10
DIF = POT(I) - POT(J)
IF DIF >= VOLT - TOL AND DIF <= VOLT + TOL THEN
COUNT = COUNT + 1
IF COUNT = 1 AND DISPLAY > 0 THEN
PRINT "PRESS ANY KEY FOR MORE": A\$ = INPUT\$(1): PRINT
END IF
PRINT ELEM\$(I); "   "; ELEM\$(J); "   ";
PRINT USING "#.##"; DIF
DISPLAY = 1
END IF
IF COUNT = 8 THEN PRINT : COUNT = 0
NEXT J
NEXT I
IF DISPLAY = 0 THEN PRINT "NO BATTERY CAN BE FORMED"

'2.10
' This program will keep score for a double dual race.
'
CLS : DIM IN\$(21)
FOR I = 1 TO 21
PRINT "Place "; I; ":"; : INPUT IN\$(I)
IF I > 1 THEN
J = 1
WHILE J <= TN AND INIT\$(J) <> IN\$(I): J = J + 1: WEND
END IF
IF (INIT\$(J) <> IN\$(I)) OR (I = 1) THEN
TN = TN + 1: INIT\$(TN) = IN\$(I)
END IF
NEXT I
'    Assert  TEAM\$(1, 2, 3) = 3 unique team INITIALS
FOR I = 1 TO 2
FOR J = I + 1 TO 3
PL = 0: T1 = 0: T2 = 0: T1PL = 0: T2PL = 0
FOR K = 1 TO 21
IF IN\$(K) = INIT\$(I) THEN
PL = PL + 1: T1 = T1 + PL: T1PL = T1PL + 1
TEAM1(T1PL) = PL
END IF
IF IN\$(K) = INIT\$(J) THEN
PL = PL + 1: T2 = T2 + PL: T2PL = T2PL + 1
TEAM2(T2PL) = PL
END IF
NEXT K
T1 = T1 - TEAM1(6) - TEAM1(7)
T2 = T2 - TEAM2(6) - TEAM2(7)
PRINT "TEAM "; INIT\$(I); ":"; T1; " POINTS"
PRINT "TEAM "; INIT\$(J); ":"; T2; " POINTS"
IF (T1 < T2) OR (T1 = T2 AND TEAM1(6) < TEAM2(6)) THEN
PRINT "TEAM "; INIT\$(I);
ELSE
PRINT "TEAM "; INIT\$(J);
END IF
PRINT " WINS!": PRINT
NEXT J
NEXT I

'3.1
' This program puts a set of real numbers in numerical order.
'
INPUT "Enter N: "; N
FOR I = 1 TO N
INPUT "Enter #: "; A(I)
NEXT I
DATA 0,8,1,2,5,4,3,9,7,6
FOR I = 0 TO 9: READ PLACE: ORDER(PLACE) = I: NEXT I
'    ***  replace digits in duplicated number  ***
FOR I = 1 TO N
NUM\$ = STR\$(A(I))
FOR J = 1 TO LEN(NUM\$)
MD\$ = MID\$(NUM\$, J, 1)
NUM = VAL(MD\$)
IF NUM > 0 OR MD\$ = "0" THEN
NUM2 = ORDER(NUM)
MID\$(NUM\$, J, 1) = MID\$(STR\$(NUM2), 2)
END IF
NEXT J
B(I) = VAL(NUM\$)
NEXT I
'   ***   sort according to numbers with replaced digits  ***
FOR I = 1 TO N - 1
FOR J = I + 1 TO N
IF B(I) > B(J) THEN SWAP B(I), B(J): SWAP A(I), A(J)
NEXT J
NEXT I
FOR I = 1 TO N: PRINT LTRIM\$(STR\$(A(I))): NEXT I

'3.2
' This program displays total number of ways to make change.
'
DEFINT B-Z
INPUT "Enter AMOUNT: "; AMOUNT
MAXQ = INT(AMOUNT * 4)
MAXD = INT(AMOUNT * 10)
MAXN = INT(AMOUNT * 20)
FOR Q = 0 TO MAXQ
FOR D = 0 TO MAXD - INT(2.5 * Q)
FOR N = 0 TO MAXN - 5 * Q - 2 * D
COUNT = COUNT + 1
NEXT N
NEXT D
NEXT Q
PRINT COUNT

'3.3
' This program determines if a point/box is inside a 2nd box.
'
INPUT "Enter point: "; PX, PY, PZ
INPUT "Enter cube1 diagonal point1: "; C1X1, C1Y1, C1Z1
INPUT "Enter cube1 diagonal point2: "; C1X2, C1Y2, C1Z2
INPUT "Enter cube2 diagonal point1: "; C2X1, C2Y1, C2Z1
INPUT "Enter cube2 diagonal point2: "; C2X2, C2Y2, C2Z2
A = C1X1: B = C1X2: GOSUB MinOfAandB: C1MINX = MIN
A = C1Y1: B = C1Y2: GOSUB MinOfAandB: C1MINY = MIN
A = C1Z1: B = C1Z2: GOSUB MinOfAandB: C1MINZ = MIN
A = C2X1: B = C2X2: GOSUB MinOfAandB: C2MINX = MIN
A = C2Y1: B = C2Y2: GOSUB MinOfAandB: C2MINY = MIN
A = C2Z1: B = C2Z2: GOSUB MinOfAandB: C2MINZ = MIN
A = C1X1: B = C1X2: GOSUB MaxOfAandB: C1MAXX = MAX
A = C1Y1: B = C1Y2: GOSUB MaxOfAandB: C1MAXY = MAX
A = C1Z1: B = C1Z2: GOSUB MaxOfAandB: C1MAXZ = MAX
A = C2X1: B = C2X2: GOSUB MaxOfAandB: C2MAXX = MAX
A = C2Y1: B = C2Y2: GOSUB MaxOfAandB: C2MAXY = MAX
A = C2Z1: B = C2Z2: GOSUB MaxOfAandB: C2MAXZ = MAX
'
PRINT "POINT ";
IF PX < C2MINX OR PY < C2MINY OR PZ < C2MINZ THEN
PRINT "DOES NOT LIE";
ELSE
IF PX > C2MAXX OR PY > C2MAXY OR PZ > C2MAXZ THEN
PRINT "DOES NOT LIE";
ELSE
PRINT "LIES";
END IF
END IF
PRINT " INSIDE 2ND CUBE"
'
PRINT "1ST CUBE ";
IF C1MINX < C2MINX OR C1MINY < C2MINY OR C1MINZ < C2MINZ THEN
PRINT "DOES NOT LIE";
ELSE
IF C1MAXX > C2MAXX OR C1MAXY > C2MAXY OR C1MAXZ > C2MAXZ THEN
PRINT "DOES NOT LIE";
ELSE
PRINT "LIES";
END IF
END IF
PRINT " INSIDE 2ND CUBE"
END
'***   SUBROUTINE to determine MIN of A and B
MinOfAandB:
IF A <= B THEN MIN = A ELSE MIN = B
RETURN
'***   SUBROUTINE to determine MAX of A and B
MaxOfAandB:
IF A >= B THEN MAX = A ELSE MAX = B
RETURN

'3.4
' This program produces an alphabetical list of permutations.
' **** Note: QBASIC has recursive capabilities, but this is
'            a way to do permutations without recursion.
' Also, this is an example of old BASIC (with line #s/branching).
'
10 DIM PERM\$(720)
20 INPUT "Enter letters:"; A\$: L = LEN(A\$)
30 FOR I = 1 TO L: B\$(I) = MID\$(A\$, I, 1): NEXT I: I = L
40 ON I GOTO 20, 90, 80, 70, 60, 50
50 FOR N6 = 1 TO 6: H = 5: GOSUB 340
60   FOR N5 = 1 TO 5: H = 4: GOSUB 340
70     FOR N4 = 1 TO 4: H = 3: GOSUB 340
80       FOR N3 = 1 TO 3: H = 2: GOSUB 340
90        FOR N2 = 1 TO 2
100          SWAP B\$(I), B\$(I - 1): TOTAL = TOTAL + 1
110          FOR J = 1 TO L
120            PERM\$(TOTAL) = PERM\$(TOTAL) + B\$(J)
130          NEXT J
140        NEXT N2: IF I = 2 THEN 190
150       NEXT N3: IF I = 3 THEN 190
160     NEXT N4: IF I = 4 THEN 190
170   NEXT N5: IF I = 5 THEN 190
180 NEXT N6
190 '***  INSERTION SORT ***
200 FOR I = 2 TO TOTAL
210   IND = I
220   WHILE PERM\$(IND) < PERM\$(IND - 1) AND IND > 1
230     SWAP PERM\$(IND), PERM\$(IND - 1): IND = IND - 1
240   WEND
250 NEXT I
260 '
270 FOR I = 1 TO TOTAL                     'With QBASIC,
280   IF PERM\$(I) = PERM\$(I - 1) THEN 300  '<==This can be written
290   PRINT PERM\$(I): TOTAL2 = TOTAL2 + 1  'using IF/END IF
300 NEXT I                                 'instead of branching.
310 PRINT "TOTAL="; TOTAL2
320 END
330 ' *****  SUBROUTINE *****
340 Z\$ = B\$(I - H)
350 FOR J = I - H TO I - 1
360   B\$(J) = B\$(J + 1)
370 NEXT J
380 B\$(I) = Z\$
390 RETURN

'3.5
' This program will control the movements of a snake.
'
CLS : DIM A(25, 81)
V = 12: H = 8: LOCATE V, H
FOR I = 8 TO 32
PRINT "*"; : A(V, I) = 1
A\$ = A\$ + "12":  B\$ = B\$ + RIGHT\$(STR\$(I), 2)
NEXT I
WHILE D\$ = "": D\$ = INKEY\$: WEND: C\$ = D\$
DO UNTIL C\$ = CHR\$(27)
FOR I = 1 TO 100
D\$ = INKEY\$:  IF D\$ <> "" THEN C\$ = D\$
NEXT I
IF C\$ = "I" THEN V = V - 1
IF C\$ = "M" THEN V = V + 1
IF C\$ = "J" THEN H = H - 1
IF C\$ = "K" THEN H = H + 1
IF A(V, H) OR V = 0 OR V = 25 OR H = 0 OR H = 81 THEN END
A(V, H) = 1: LOCATE V, H: PRINT "*"
X = VAL(RIGHT\$(A\$, 2)): Y = VAL(RIGHT\$(B\$, 2))
LOCATE X, Y: PRINT " "
A(X, Y) = 0
A\$ = LEFT\$(A\$, 24 * 2): B\$ = LEFT\$(B\$, 24 * 2)
A\$ = RIGHT\$(STR\$(V), 2) + A\$
B\$ = RIGHT\$(STR\$(H), 2) + B\$
LOOP

'3.6
' This program will solve two linear equations.
'
INPUT "Enter equation 1: "; E1\$
INPUT "Enter equation 2: "; E2\$
'
' Determine coeficients A1,B1,C1 and A2,B2,C2
'
EQ\$ = E1\$: ST = 1: GOSUB ParseEq: : A1 = VAAL
EQ\$ = E1\$: GOSUB ParseEq: : B1 = VAAL
EQ\$ = E1\$: GOSUB ParseEq: : C1 = VAAL
EQ\$ = E2\$: ST = 1: GOSUB ParseEq: : A2 = VAAL
EQ\$ = E2\$: GOSUB ParseEq: : B2 = VAAL
EQ\$ = E2\$: GOSUB ParseEq: : C2 = VAAL
'
' Compute solution if it exists
'
DEN = A1 * B2 - A2 * B1
NUMX = C1 * B2 - C2 * B1
NUMY = A1 * C2 - A2 * C1
IF DEN = 0 THEN PRINT "NO UNIQUE SOLUTION EXISTS.": END
PRINT "XSOLUTION= ";
IF NUMX / DEN < 0 THEN
PRINT USING "##.#"; NUMX / DEN;
ELSE
PRINT USING "#.#"; NUMX / DEN;
END IF
PRINT "   YSOLUTION= ";
IF NUMY / DEN < 0 THEN
PRINT USING "##.#"; NUMY / DEN
ELSE
PRINT USING "#.#"; NUMY / DEN
END IF
END
'
' Find Starting position ST of value
'
ParseEq:
SYGN = 1    'Default to 1 (positive for unsigned #s)
MD\$ = "="
WHILE MD\$ = "="
MD\$ = MID\$(EQ\$, ST, 1)
IF MD\$ = "X" THEN VAAL = 1: ST = ST + 1: RETURN
IF MD\$ = "=" THEN ST = ST + 1
WEND
IF MD\$ = "+" THEN ST = ST + 1
IF MD\$ = "-" THEN SYGN = -1: ST = ST + 1
'
' Find ending position EN of value
'
EN = ST: VAAL = 0: MD\$ = MID\$(EQ\$, EN, 1): L = LEN(EQ\$)
WHILE EN <= L AND (MD\$ <> "X" AND MD\$ <> "Y" AND MD\$ <> "=")
MD\$ = MID\$(EQ\$, EN, 1)
EN = EN + 1
WEND
EN = EN - 1
IF MD\$ = "X" OR MD\$ = "Y" OR MD\$ = "=" THEN EN = EN - 1
IF MD\$ = "=" THEN SYGN = -SYGN         'Bring C to other side
IF ST > EN THEN   'No Value
VAAL = SYGN: ST = ST + 1
ELSE              'Determine Value
MD\$ = MID\$(EQ\$, ST, EN - ST + 1)
VAAL = SYGN * VAL(MD\$): ST = EN + 2
END IF
RETURN

'3.7
' This program displays all simi-perfect #s between 2 and 35.
'
DEFINT A-Z
DIM A(20), B(20)
PRINT "SEMI #  EXAMPLE(S)"
FOR NUM = 2 TO 34: MAX = 0
FOR DIV = 1 TO NUM / 2
IF NUM MOD DIV = 0 THEN MAX = MAX + 1: B(MAX) = DIV
NEXT DIV
FOR B = 2 TO MAX
L = MAX: GOSUB Combo
NEXT B
NEXT NUM: END
'
' Produce combinations
'
Combo:
FOR I = 1 TO B: A(I) = B - I + 1: NEXT I
A(1) = A(1) - 1: N = 1
'
WHILE N <= B
A(N) = A(N) + 1
FOR I = N - 1 TO 1 STEP -1: A(I) = A(I + 1) + 1: NEXT I
IF A(N) <= L - N + 1 THEN
SUM = 0: FOR I = 1 TO B: SUM = SUM + B(A(I)): NEXT I
IF SUM = NUM THEN
'
PRINT USING "##"; NUM; : PRINT SPACE\$(5); B(A(B));
FOR I = B - 1 TO 1 STEP -1
PRINT "+"; B(A(I));
NEXT I: PRINT
END IF
N = 0
END IF
N = N + 1
WEND
RETURN

'3.8
' This program will keep score for a bowler.
'
DIM A(10, 3): CLS
INPUT "Enter frames:"; F\$: F\$ = F\$ + " "
FOR I = 1 TO 10
COMMAPOS = INSTR(F\$, " ")
A\$(I) = MID\$(F\$, 1, COMMAPOS - 1)
F\$ = MID\$(F\$, COMMAPOS + 1, LEN(F\$) - COMMAPOS)
NEXT I
PRINT
PRINT "-1- -2- -3- -4- -5- -6- -7- -8- -9- -10-"
PRINT "---!---!---!---!---!---!---!---!---!---!"
FOR I = 1 TO 10
PRINT SPACE\$(3 - LEN(A\$(I))); A\$(I); "!";
NEXT I
PRINT
'
' Assign values to A FRames according to X, /, or pins
'
FOR FR = 1 TO 10
L = LEN(A\$(FR))
FOR J = 1 TO L
MD\$ = MID\$(A\$(FR), J, 1)
IF MD\$ = "X" THEN
A(FR, J) = 10: LOOK(FR) = 2
ELSE
IF MD\$ = "/" THEN
A(FR, J) = 10 - A(FR, J - 1): LOOK(FR) = 1
ELSE
A(FR, J) = VAL(MD\$)
END IF
END IF
NEXT J
NEXT FR
'
' Determine FRame values with LOOK ahead
'
FOR FR = 1 TO 10
SUM(FR) = SUM(FR - 1) + A(FR, 1) + A(FR, 2)
IF LOOK(FR) > 0 THEN
IF LOOK(FR) <= 1 THEN
'      ***  A spare / needs 1 more value added  ***
IF FR = 10 THEN
SUM(FR) = SUM(FR) + A(FR, 3)
ELSE
SUM(FR) = SUM(FR) + A(FR + 1, 1)
END IF
ELSE
'      ***  A strike X needs 2 more values added  ***
IF FR = 10 THEN
SUM(FR) = SUM(FR) + A(FR, 3)
ELSE
SUM(FR) = SUM(FR) + A(FR + 1, 1) + A(FR + 1, 2)
IF FR <> 9 THEN
IF A(FR + 1, 1) = 10 THEN
SUM(FR) = SUM(FR) + A(FR + 2, 1)
END IF
END IF
END IF
END IF
END IF
'      *** Print FRame's value ***
SUM\$ = MID\$(STR\$(SUM(FR)), 2)
PRINT SUM\$; SPACE\$(3 - LEN(SUM\$)); "!";
NEXT FR
PRINT : PRINT STRING\$(40, "-")

'3.9
' This program will convert a real from one base to another.
'
INPUT "Enter M, N, #: "; M, N, NUM\$
PRINT LEFT\$(NUM\$, 2);
NUM\$ = MID\$(NUM\$, 3):
MDIGITS = LEN(NUM\$)   'Digits on right of period(.)
'
NDIGITS = 1
WHILE (1 / N) ^ NDIGITS > (1 / M) ^ MDIGITS AND NDIGITS < 7
NDIGITS = NDIGITS + 1
WEND
'
' SUM= Base 10 # of NUM\$
'
FOR I = 1 TO MDIGITS
MD\$ = MID\$(NUM\$, I, 1)
MD = ASC(MD\$) - 48: IF MD > 9 THEN MD = MD - 7
SUM = SUM + MD / (M ^ I)
NEXT I
'
' Convert base 10 decimal to Base N fraction
'
FOR I = 1 TO NDIGITS + 1
SUM = SUM * N: NUM(I) = INT(SUM): SUM = SUM - NUM(I)
NEXT I
'
' Print fraction with last digit rounded according to NDIGIT+1
'
FOR I = 1 TO NDIGITS - 1
PRINT CHR\$(48 + NUM(I) - (NUM(I) > 9) * 7);
NEXT I
IF NUM(NDIGITS + 1) >= N / 2 THEN NUM(NDIGITS) = NUM(NDIGITS) + 1
PRINT CHR\$(48 + NUM(NDIGITS) - (NUM(NDIGITS) > 9) * 7);

'3.10
' This program computes the composition of P(Q) and Q(P).
'
INPUT "Enter to the ORDER of p(x): "; PORDER
FOR I = PORDER TO 0 STEP -1
PRINT "Enter coefficient for x**"; I; ": "; : INPUT PCO(I)
NEXT I: PRINT
INPUT "Enter to the ORDER of q(x): "; QORDER
FOR I = QORDER TO 0 STEP -1
PRINT "Enter coefficient for x**"; I; ": "; : INPUT QCO(I)
NEXT I
PRINT "P(Q(X))= "; : GOSUB CompPofQ
PRINT
' *****  Swap P and Q to perform Q(P(X))  *****
SWAP PORDER, QORDER
IF PORDER > QORDER THEN MAX = PORDER ELSE MAX = QORDER
FOR I = 0 TO MAX: SWAP PCO(I), QCO(I): NEXT I
PRINT "Q(P(X))= "; : GOSUB CompPofQ
END
'
' *****  Compute composition P of Q  *****
'
CompPofQ:
COMPORDER = PORDER * QORDER
FOR I = 1 TO COMPORDER: POFQ(I) = 0: NEXT I
FOR I = 0 TO PORDER
IF PCO(I) <> 0 THEN
IF I = 0 THEN
POFQ(0) = PCO(0)
ELSE
FOR J = 0 TO QORDER: PROD(J) = QCO(J): NEXT J
PRODORDER = QORDER
IF I <> 1 THEN
FOR IN = 1 TO I - 1
FOR J = 0 TO PRODORDER: PROD2(J) = 0: NEXT J
FOR J = 0 TO PRODORDER
FOR K = 0 TO QORDER
PROD2(J + K) = PROD2(J + K) + PROD(J) * QCO(K)
NEXT K
NEXT J
PRODORDER = J + K
FOR L = 0 TO PRODORDER
PROD(L) = PROD2(L): PROD2(L) = 0
NEXT L
NEXT IN
END IF
FOR J = 0 TO PRODORDER
PROD(J) = PROD(J) * PCO(I)
NEXT J
FOR J = PRODORDER TO 0 STEP -1
POFQ(J) = POFQ(J) + PROD(J)
NEXT J
END IF
END IF
NEXT I
' *****  Print composition *****
FOR I = COMPORDER TO 0 STEP -1
IF I < COMPORDER THEN PRINT " + ";
PRINT LTRIM\$(STR\$(POFQ(I))); "X**"; LTRIM\$(STR\$(I));
NEXT I
RETURN

```