```          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"
IF IN\$ = "ADD" THEN
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 1642,"BLAISE PASCAL","ADDING MACHINE"
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
READ DAT, NAM\$, INV\$
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

```