FLORIDA HIGH SCHOOLS COMPUTING COMPETITION '93
BASIC PROGRAM SOLUTIONS
'1.1
' This program displays six lines with "GTEDS".
'
FOR I = 1 TO 6
FOR J = 1 TO 7 - I
PRINT "GTEDS"; SPACE$(I);
NEXT J
PRINT
NEXT I
'1.2
' This program displays the number of programmers placed.
'
INPUT "Enter N:"; N
INPUT "Enter M:"; M
PRINT N * 15 - M; "PROGRAMMERS"
'1.3
' This program will format the number N million with commas.
'
INPUT "Enter N:"; N
PRINT USING "##,###,### ACCESS LINES"; N * 1000000!
'1.4
' This program will total the # of students on 5 USF campuses.
'
DATA Tampa,St. Petersburg,Fort Myers,Lakeland,Sarasota
FOR I = 1 TO 5
READ CAMPUS$
PRINT "Enter # at "; CAMPUS$; ":";
INPUT NUM
TOTAL = TOTAL + NUM
NEXT I
PRINT TOTAL; "STUDENTS"
'1.5
' This program will determine if person qualifies for ISOP.
'
INPUT "Enter name:"; NAME$
INPUT "Enter level:"; LEVEL
INPUT "Enter desire:"; DESIRE$
PRINT NAME$; " IS ";
IF (LEVEL < 5) OR (DESIRE$ = "NO") THEN PRINT "NOT ";
PRINT "A POSSIBLE CANDIDATE FOR ISOP"
'1.6
' This program will display preferred skills for curriculum.
'
INPUT "Enter curriculum:"; CURR$
IF CURR$ = "MVS/COBOL" THEN
PRINT "COBOL"
PRINT "JCL"
PRINT "MVS/ESA"
PRINT "TSO/ISPF"
PRINT "VSAM"
PRINT "ANSI SQL"
PRINT "DB2"
PRINT "IMS"
ELSE
PRINT "C"
PRINT "UNIX"
PRINT "ANSI SQL"
PRINT "OSF/MOTIF"
PRINT "SHELL PROGRAMMING"
END IF
'1.7
' This program will print the first N letters of alphabet.
'
INPUT "Enter N:"; N
FOR I = 1 TO N
PRINT CHR$(64 + I);
NEXT I
'1.8
' This program will calculate the increase in salary.
'
INPUT "Enter salary:"; SALARY
INPUT "Enter rating:"; LEVEL$
SELECT CASE LEVEL$
CASE "EXCELLENT": INCREASE = SALARY * .1
CASE "ABOVE AVERAGE": INCREASE = SALARY * .07
CASE "GOOD": INCREASE = SALARY * .05
END SELECT
PRINT USING "NEW SALARY = $#####.##"; SALARY + INCREASE
'1.9
' This program will display a Service Order
'
DATA INSTALL,CHANGE,RECORDS,OUT,FROM,TO
INPUT "Enter order: "; ORDER$
CH$ = LEFT$(ORDER$, 1)
IF LEN(ORDER$) > 1 THEN PRINT CH$: END
READ A$
WHILE LEFT$(A$, 1) <> CH$: READ A$: WEND
PRINT A$
'1.10
' This program will compute a GPA for 5 classes.
'
NUM = 5
FOR I = 1 TO 5
INPUT "Enter grade:"; G$
SELECT CASE G$
CASE "A": SUM = SUM + 4
CASE "B": SUM = SUM + 3
CASE "C": SUM = SUM + 2
CASE "D": SUM = SUM + 1
CASE "W": NUM = NUM - 1
END SELECT
NEXT I
PRINT USING "GPA = #.###"; SUM / NUM
'2.1
' This program will randomly generate #s between X and Y.
'
RANDOMIZE TIMER
INPUT "Enter N:"; N
INPUT "Enter X, Y:"; X, Y
IF X < Y THEN MIN = X: MAX = Y ELSE MIN = Y: MAX = X
FOR I = 1 TO N
X = INT(RND(3) * (MAX - MIN + 1)) + MIN
IF X < 0 THEN PRINT " ";
PRINT STR$(X);
NEXT I
'2.2
' This program will sort names according to their title.
'
DATA P,PA,SA,SE,SSE,ASE,SASE
FOR I = 1 TO 7: READ TITLES$(I): NEXT I
INPUT "Enter N:"; N
FOR I = 1 TO N
INPUT "Enter name:"; NAM$(I)
INPUT "Enter title:"; TITLE$
NAM$(I) = NAM$(I) + " - " + TITLE$
J = 1
WHILE TITLES$(J) <> TITLE$: J = J + 1: WEND
L(I) = J
NEXT I
FOR I = 1 TO N - 1
FOR J = I + 1 TO N
IF L(I) <= L(J) OR (L(I) = L(J) AND NAM$(I) > NAM$(J)) THEN
SWAP NAM$(I), NAM$(J)
SWAP L(I), L(J)
END IF
NEXT J
NEXT I
FOR I = 1 TO N: PRINT NAM$(I): NEXT I
'2.3
' This program will foramt a COBOL declaration.
'
DIM FIELD$(15)
I = 0
WHILE (FIELD$(I) > "") OR (I = 0)
I = I + 1
INPUT "Enter field:"; FIELD$(I)
WEND
FOR J = 1 TO I - 1
LEVEL$ = MID$(FIELD$(J), 1, 2)
IF LEVEL$ = "01" THEN
INC = 0
ELSE
IF LEVEL$ > PREVLEVEL$ THEN INC = INC + 4
IF LEVEL$ < PREVLEVEL$ THEN INC = INC - 4
END IF
PRINT SPACE$(INC);
PRINT FIELD$(J)
PREVLEVEL$ = LEVEL$
NEXT J
'2.4
' This program will translate a word and calculate blocks.
'
INPUT "Enter word:"; WORD$
NUM$ = ""
FOR I = 1 TO LEN(WORD$)
NUM = ASC(MID$(WORD$, I, 1)) - ASC("A") + 1
NUM$ = NUM$ + MID$(STR$(NUM), 2)
NEXT I
PRINT "NUMBER = "; NUM$
BLOCKS = 1
LASTDIGIT = VAL(MID$(NUM$, 1, 1))
FOR I = 2 TO LEN(NUM$)
DIGIT = VAL(MID$(NUM$, I, 1))
IF DIGIT MOD 2 <> LASTDIGIT MOD 2 THEN BLOCKS = BLOCKS + 1
LASTDIGIT = DIGIT
NEXT I
PRINT "BLOCKS ="; BLOCKS
'2.5
' This program will display N formatted telephone #s.
'
INPUT "Enter N:"; N
FOR I = 1 TO N
INPUT "Enter #:"; NUM$(I)
NEXT I
TOTAL = 1: NUM$(I + 1) = SPACE$(10)
FOR I = 1 TO N
NPA$ = MID$(NUM$(I), 1, 3)
NXX$ = MID$(NUM$(I), 4, 3)
LIN$ = MID$(NUM$(I), 7, 4)
PRINT NPA$; "-"; NXX$; "-"; LIN$;
NEXTNPA$ = MID$(NUM$(I + 1), 1, 3)
NEXTNXX$ = MID$(NUM$(I + 1), 4, 3)
IF NPA$ <> NEXTNPA$ THEN
PRINT " TOTAL FOR NPA OF "; NPA$; " ="; TOTAL
PRINT : TOTAL = 1
ELSE
TOTAL = TOTAL + 1
IF NXX$ <> NEXTNXX$ THEN PRINT
END IF
PRINT
NEXT I
'2.6
' This program will calculate product bought minus coupons.
'
WHILE PROD$(I) <> "9"
I = I + 1
INPUT "Enter product:"; PROD$(I)
IF PROD$(I) <> "9" THEN INPUT "Enter price:"; PRIC(I)
WEND
NUMPROD = I - 1
PRINT
DO UNTIL COUP$(J) = "9"
J = J + 1
INPUT "Enter coupon:"; COUP$(J)
IF COUP$(J) <> "9" THEN INPUT "Enter discount:"; DISC(J)
LOOP
NUMCOUP = J - 1
FOR I = 1 TO NUMPROD
MAXDISC = 0
FOR J = 1 TO NUMCOUP
IF PROD$(I) = COUP$(J) AND DISC(J) > MAXDISC THEN
MAXDISC = DISC(J): IND = J
END IF
NEXT J
TOTAL = TOTAL + PRIC(I) - MAXDISC
COUP$(IND) = "*"
NEXT I
PRINT : PRINT "TOTAL = $";
IF TOTAL < 10 THEN PRINT USING "#.##"; TOTAL
IF TOTAL >= 10 THEN PRINT USING "##.##"; TOTAL
'2.7
' This program will display dates in other formats.
'
INPUT "Enter format:"; format$
INPUT "Enter date:"; DAT$
SELECT CASE format$
CASE "ISO"
YYYY$ = MID$(DAT$, 1, 4)
MM$ = MID$(DAT$, 6, 2)
DD$ = MID$(DAT$, 9, 2)
CASE "AMERICAN"
MM$ = MID$(DAT$, 1, 2)
DD$ = MID$(DAT$, 4, 2)
YYYY$ = MID$(DAT$, 7, 4)
CASE "EUROPEAN"
DD$ = MID$(DAT$, 1, 2)
MM$ = MID$(DAT$, 4, 2)
YYYY$ = MID$(DAT$, 7, 4)
END SELECT
IF format$ <> "ISO" THEN
PRINT "ISO = "; YYYY$; "-"; MM$; "-"; DD$
END IF
IF format$ <> "AMERICAN" THEN
PRINT "AMERICAN = "; MM$; "-"; DD$; "-"; YYYY$
END IF
IF format$ <> "EUROPEAN" THEN
PRINT "EUROPEAN = "; DD$; "-"; MM$; "-"; YYYY$
END IF
'2.8
' This program will reverse the words in 1 or 2 sentences.
'
INPUT "Enter sentence:"; SENT$
NUM = 1: WORD$(NUM) = "": I = 1
WHILE I <= LEN(SENT$)
CH$ = MID$(SENT$, I, 1)
IF CH$ = "." THEN
FOR J = NUM TO 1 STEP -1
IF J < NUM THEN PRINT " ";
PRINT WORD$(J);
NEXT J
PRINT ". ";
NUM = 0: I = I + 1
ELSE ' -- NOT A PERIOD
IF CH$ <> " " THEN
WORD$(NUM) = WORD$(NUM) + CH$
ELSE
NUM = NUM + 1: WORD$(NUM) = ""
END IF
END IF
I = I + 1
WEND
'2.9
' This program will print 4 smallest #s in a 4 x 4 matrix.
'
DIM B(16)
FOR I = 1 TO 4
PRINT USING "Enter row #:"; I;
INPUT A(I, 1), A(I, 2), A(I, 3), A(I, 4)
NEXT I
FOR I = 1 TO 4
FOR J = 1 TO 4
B((I - 1) * 4 + J) = A(I, J)
NEXT J
NEXT I
'
FOR I = 1 TO 15
FOR J = I + 1 TO 16
IF B(I) > B(J) THEN SWAP B(I), B(J)
NEXT J
NEXT I
'
K = 1: B(0) = -99
WHILE (NUM < 4) OR (B(K) = B(K - 1))
ONEDISP = 0
IF B(K) <> B(K - 1) THEN
PRINT
NUM = NUM + 1
PRINT USING "#"; NUM;
PRINT ". SMALLEST ="; B(K); "OCCURS AT ";
FOR I = 1 TO 4
FOR J = 1 TO 4
IF B(K) = A(I, J) THEN
IF ONEDISP THEN PRINT ", "; ELSE ONEDISP = 1
PRINT USING "(#"; I; : PRINT USING ",#"; J;
PRINT ")";
END IF
NEXT J
NEXT I
END IF
K = K + 1
WEND
'2.10
' This program will print # of days between two dates.
'
DATA 31,28,31,30,31,30,31,31,30,31,30,31
DIM MONTH(12): FOR I = 1 TO 12: READ MONTH(I): NEXT I
INPUT "Enter month:"; M
INPUT "Enter day:"; D
INPUT "Enter year:"; Y
' October 25, 1967
FOR I = 1 TO 9
DAYS2 = DAYS2 + MONTH(I)
NEXT I
DAYS2 = DAYS2 + 25
'
FOR I = 1967 TO Y - 1
DAYS = DAYS + 365
IF I MOD 4 = 0 THEN DAYS = DAYS + 1
NEXT I
IF (Y MOD 4 = 0) AND (M > 2) THEN DAYS = DAYS + 1
FOR I = 1 TO M - 1
DAYS = DAYS + MONTH(I)
NEXT I
DAYS = DAYS + D
PRINT DAYS - DAYS2; "DAYS"
'3.1
' This program displays GTEDS squares relative to cursor.
' Cursor can be moved up, left, down, right: I, J, K, M.
CLS
R = 5: C = 5: K$ = " "
WHILE K$ < "1" OR K$ > "4"
LOCATE R, C: PRINT "#": K$ = ""
WHILE K$ = "": K$ = INKEY$: WEND
IF K$ >= "I" AND K$ <= "M" THEN
LOCATE R, C: PRINT " "
IF K$ = "I" THEN R = R - 1
IF K$ = "M" THEN R = R + 1
IF K$ = "J" THEN C = C - 1
IF K$ = "K" THEN C = C + 1
END IF
WEND
X = ASC(K$) - ASC("0")
IF X = 1 THEN A = 1: B = 0
IF X = 2 THEN A = 1: B = -1
IF X = 3 THEN A = -1: B = -1
IF X = 4 THEN A = -1: B = 0
IF (R + 5 * A > 24) OR (R + 5 * A < 1) THEN
PRINT "OFF THE SCREEN": END
ELSE
IF (C + 9 * B + 9 > 80) OR (C + 9 * B < 1) THEN
PRINT "OFF THE SCREEN": END
ELSE
LOCATE R + 1 * A, C + 8 * B: PRINT "G T E D S"
LOCATE R + 2 * A, C + 8 * B: PRINT "T D"
LOCATE R + 3 * A, C + 8 * B: PRINT "E "; X; " E"
LOCATE R + 4 * A, C + 8 * B: PRINT "D T"
LOCATE R + 5 * A, C + 8 * B: PRINT "S D E T G"
END IF
END IF
'3.2
' This program will solve an equation with +,-,*, or /.
'
INPUT "Enter value:"; V1$
INPUT "Enter symbol:"; S1$
INPUT "Enter value:"; V2$
INPUT "Enter symbol:"; S2$
INPUT "Enter value:"; V3$
IF S1$ = "=" THEN
S1$ = S2$: S2$ = "="
X$ = V1$: V1$ = V2$: V2$ = V3$: V3$ = X$
END IF
' Equation is now of the form V1 [op] V2 = V3
N1 = VAL(V1$)
N2 = VAL(V2$)
N3 = VAL(V3$)
PRINT "X =";
SELECT CASE S1$
CASE "+"
IF V1$ = "X" THEN PRINT N3 - N2
IF V2$ = "X" THEN PRINT N3 - N1
IF V3$ = "X" THEN PRINT N1 + N2
CASE "-"
IF V1$ = "X" THEN PRINT N3 + N2
IF V2$ = "X" THEN PRINT N1 - N3
IF V3$ = "X" THEN PRINT N1 - N2
CASE "*"
IF V1$ = "X" THEN PRINT N3 / N2
IF V2$ = "X" THEN PRINT N3 / N1
IF V3$ = "X" THEN PRINT N1 * N2
CASE "/"
IF V1$ = "X" THEN PRINT N3 * N2
IF V2$ = "X" THEN PRINT N1 / N3
IF V3$ = "X" THEN PRINT N1 / N2
END SELECT
'3.3
' This program prints combinations of digits summing to #.
'
INPUT "Enter digits:"; DIGITS$
INPUT "Enter sum:"; SUM
NEWSUM = INT(SUM / 10) * 8 + (SUM MOD 10)
LAST = LEN(DIGITS$)
FOR I = 1 TO LAST
DIGIT(I) = VAL(MID$(DIGITS$, I, 1))
NEXT I
'
POWER = 1
FOR I = 1 TO LAST: POWER = POWER * 2: NEXT I
POWER = POWER - 1
'
FOR I = 1 TO POWER
J = 1
WHILE (A(J) = 1)
A(J) = 0: J = J + 1
WEND
A(J) = 1
TOTAL = 0
FOR J = 1 TO LAST
IF A(J) = 1 THEN TOTAL = TOTAL + DIGIT(J)
NEXT J
ONEPRINT = 0
IF TOTAL = NEWSUM THEN
FOR J = 1 TO LAST
IF A(J) = 1 THEN
IF ONEPRINT THEN PRINT "+"; ELSE ONEPRINT = 1
PRINT USING "#"; DIGIT(J);
END IF
NEXT J
PRINT " ="; SUM
END IF
NEXT I
'3.4
' This program will decompose a large integer into primes.
'
DIM A(80), Q(80)
INPUT "Enter number:"; LONGNUM$
L = LEN(LONGNUM$)
FOR I = 1 TO L
A(I) = VAL(MID$(LONGNUM$, I, 1))
NEXT I
PRIME = 2: POWER = 0
FIRSTFACTOR = 1: QUOTIENTIS0 = 0
WHILE NOT QUOTIENTIS0
' Check if LongNum (Array A) is divisble by Prime
NUM = 0
FOR I = 1 TO L
NUM = NUM * 10 + A(I)
Q(I) = INT(NUM / PRIME)
NUM = NUM - Q(I) * PRIME
NEXT I
IF NUM = 0 THEN
' Prime divided LongNum
I = 1
WHILE (Q(I) = 0) AND (I <= L): I = I + 1: WEND
QUOTIENTIS0 = (I = L) AND (Q(L) = 1)
L = L - I + 1
' Copy Quotient into array A to be divided again
FOR J = 1 TO L
A(J) = Q(J + I - 1)
NEXT J
POWER = POWER + 1
ELSE
' Prime did not divide LongNum
IF POWER >= 1 THEN GOSUB DisplayFactor
GOSUB GetNextPrime
END IF
WEND
GOSUB DisplayFactor: END
' Display Factor
DisplayFactor:
IF FIRSTFACTOR THEN FIRSTFACTOR = 0 ELSE PRINT " * ";
PRINT MID$(STR$(PRIME), 2);
IF POWER > 1 THEN PRINT "^"; MID$(STR$(POWER), 2);
POWER = 0
RETURN
' Get next prime
GetNextPrime:
IF PRIME = 2 THEN PRIME = 3: RETURN
ISPRIME = 0
WHILE ISPRIME = 0
PRIME = PRIME + 2
ISPRIME = 1
FOR J = 3 TO INT(SQR(PRIME))
IF PRIME MOD J = 0 THEN ISPRIME = 0
NEXT J
WEND
RETURN
'3.5
' This program will find words in a 12 x 11 array of letters.
'
DIM A$(12), B$(12)
A$(1) = "DATAADFBAAM": A$(2) = "JARBJCEDFOI"
A$(3) = "REAEEXEVDBC": A$(4) = "JESUSDEERNR"
A$(5) = "FABUUNMIEMO": A$(6) = "LLMNSOIPTKC"
A$(7) = "POQRSITRUOH": A$(8) = "ABUVKWSXPPI"
A$(9) = "SOYZCPULMLP": A$(10) = "CCISABCDOAM"
A$(11) = "AEFGRHIJCRM": A$(12) = "LKLETTEKSID"
' String together the columns instead of rows
FOR I = 1 TO 11
B$(I) = ""
FOR J = 1 TO 12
B$(I) = B$(I) + MID$(A$(J), I, 1)
NEXT J
NEXT I
INPUT "Enter word:"; WORD$(1)
L = LEN(WORD$(1))
' Reverse word
WORD$(2) = ""
FOR I = 1 TO L
WORD$(2) = WORD$(2) + MID$(WORD$(1), L - I + 1, 1)
NEXT I
'
' Find words horizontally, (frontwards and backwards)
'
J = 0
WHILE (COL = 0) AND (J < 2)
J = J + 1: ROW = 0
WHILE (ROW < 12) AND (COL = 0)
ROW = ROW + 1
COL = INSTR(1, A$(ROW), WORD$(J))
WEND
WEND
'
IF COL = 0 THEN
ROW = 0: J = 0
ELSE
IF J = 1 THEN C1 = COL: C2 = COL + L - 1
IF J = 2 THEN C1 = COL + L - 1: C2 = COL
R1 = ROW: R2 = ROW
GOTO DisplayCoordinates
END IF
'
' Find words vertically, (frontwards and backwards)
'
WHILE (ROW = 0) AND (J < 2)
J = J + 1: COL = 0
WHILE (COL < 11) AND (ROW = 0)
COL = COL + 1
ROW = INSTR(1, B$(COL), WORD$(J))
WEND
WEND
IF ROW = 0 THEN END
IF J = 1 THEN R1 = ROW: R2 = ROW + L - 1
IF J = 2 THEN R1 = ROW + L - 1: R2 = ROW
C1 = COL: C2 = COL
'
' Display coordinates
'
DisplayCoordinates:
PRINT USING "FIRST LETTER: (##"; R1;
PRINT USING ", ##"; C1; : PRINT ")"
PRINT USING "LAST LETTER: (##"; R2;
PRINT USING ", ##"; C2; : PRINT ")"
'3.6
' This program will solve two inequality equations.
'
INPUT "Enter equation 1:"; EQ1$
INPUT "Enter logical op:"; OP$
INPUT "Enter equation 2:"; EQ2$
S1$ = MID$(EQ1$, 2, 1)
S2$ = MID$(EQ2$, 2, 1)
N1 = VAL(MID$(EQ1$, 3, 1))
N2 = VAL(MID$(EQ2$, 3, 1))
NOS1 = (S1$ = "<" AND S2$ = ">" AND OP$ = "AND" AND N1 <= N2)
NOS2 = (S1$ = ">" AND S2$ = "<" AND OP$ = "AND" AND N1 >= N2)
IF NOS1 OR NOS2 THEN PRINT "NO SOLUTION": END
ALL1 = (S1$ = "<" AND S2$ = ">" AND OP$ = "OR" AND N1 > N2)
ALL2 = (S1$ = ">" AND S2$ = "<" AND OP$ = "OR" AND N1 < N2)
IF ALL1 OR ALL2 THEN PRINT "ALL INTEGERS": END
IF N < N2 THEN MIN = N1: MAX = N2 ELSE MIN = N2: MAX = N1
' Check for finite solution, and if less than 6 integers
FIN1 = (S1$ = "<" AND S2$ = ">" AND OP$ = "AND" AND N1 > N2)
FIN2 = (S1$ = ">" AND S2$ = "<" AND OP$ = "AND" AND N1 < N2)
IF (FIN1 OR FIN2) THEN
IF MAX - MIN > 7 THEN
A = MIN + 1: B = MIN + 3: GOSUB DisplayNumbers
PRINT "...";
A = MAX - 3: B = MAX - 1: GOSUB DisplayNumbers: END
END IF
A = MIN + 1: B = MAX - 1: GOSUB DisplayNumbers: END
END IF
' Check for infinite # of negative solutions
IF (S1$ = "<" AND S2$ = "<" AND OP$ = "AND") THEN
PRINT "...";
A = MIN - 3: B = MIN - 1: GOSUB DisplayNumbers: END
END IF
' Check for infinite # of positive solutions
IF (S1$ = ">" AND S2$ = ">" AND OP$ = "AND") THEN
A = MAX + 1: B = MAX + 3
PRINT "...": END
END IF
' Check for infinite # of positive and negative solutions
IN1 = (S1$ = ">" AND S2$ = "<" AND OP$ = "OR" AND N1 > N2)
IN2 = (S1$ = "<" AND S2$ = ">" AND OP$ = "OR" AND N1 < N2)
IF (IN1 OR IN2) THEN
PRINT "...";
A = MIN - 3: B = MIN - 1: GOSUB DisplayNumbers
PRINT " ";
A = MAX + 1: B = MAX + 3: GOSUB DisplayNumbers
PRINT "...";
END IF
END
' Display numbers
DisplayNumbers:
IF A < 0 THEN PRINT LEFT$(STR$(A), 2);
IF A >= 0 THEN PRINT USING "#"; A;
FOR I = A + 1 TO B
PRINT ",";
IF I < 0 THEN PRINT LEFT$(STR$(I), 2);
IF I >= 0 THEN PRINT USING "#"; I;
NEXT I
RETURN
'3.7
' This program will print the sum and product of 2 matrices.
'
BASE$ = "0123456789ABCDEF"
FOR I = 1 TO 2
FOR J = 1 TO 3
FOR K = 1 TO 3
PRINT USING "Enter Mat#"; I; : PRINT " (";
PRINT USING "#"; J; : PRINT ","; : PRINT USING "#"; K;
INPUT ")"; NUM$
L = LEN(NUM$): TENS = 0
IF L = 2 THEN
TENS = (INSTR(1, BASE$, MID$(NUM$, 1, 1)) - 1) * 16
END IF
ONES = INSTR(1, BASE$, MID$(NUM$, L, 1)) - 1
MAT(I, J, K) = TENS + ONES
NEXT K
NEXT J
NEXT I
' Compute sum
PRINT "SUM =";
FOR I = 1 TO 3
FOR J = 1 TO 3
SUM = MAT(1, I, J) + MAT(2, I, J)
PRINT SPACE$(6 - LEN(HEX$(SUM))); HEX$(SUM);
NEXT J
PRINT
IF I < 3 THEN PRINT SPACE$(5);
NEXT I
PRINT
' Compute product
PRINT "PRODUCT =";
FOR I = 1 TO 3
FOR J = 1 TO 3
PROD = 0
FOR K = 1 TO 3
PROD = PROD + MAT(1, I, K) * MAT(2, K, J)
NEXT K
PRINT SPACE$(6 - LEN(HEX$(PROD))); HEX$(PROD);
NEXT J
PRINT
IF I < 3 THEN PRINT SPACE$(9);
NEXT I
'3.8
' This program will find three 3-digit primes.
'
DEFINT A-Z
DIM P(200)
NUM = 101: PNUM = 0
WHILE NUM < 999
SQ = INT(SQR(NUM)): I = 3
WHILE (I <= SQ) AND (NUM MOD I > 0): I = I + 1: WEND
IF I > SQ THEN
N2 = NUM
D1 = INT(N2 / 100)
N2 = N2 - D1 * 100
D2 = INT(N2 / 10)
D3 = N2 - D2 * 10
IF NOT (D1 = 0 OR D2 = 0 OR D3 = 0) THEN
IF NOT (D1 = D2 OR D2 = D3 OR D1 = D3) THEN
PNUM = PNUM + 1: P(PNUM) = NUM
END IF
END IF
END IF
NUM = NUM + 2
WEND
FOR I = 1 TO PNUM - 2
FOR J = I + 1 TO PNUM - 1
FOR K = J + 1 TO PNUM
TOT = P(I) + P(J) + P(K)
IF TOT > 1234 THEN
P1$ = MID$(STR$(P(I)), 2)
P2$ = MID$(STR$(P(J)), 2)
P3$ = MID$(STR$(P(K)), 2)
PCAT$ = P1$ + P2$ + P3$
FOR L = 1 TO 9: A(L) = 0: NEXT L: L = 0
WHILE (L < 9) AND (A(X) < 2)
L = L + 1
X = VAL(MID$(PCAT$, L, 1))
A(X) = A(X) + 1
WEND
IF A(X) < 2 THEN
SUM$ = MID$(STR$(TOT), 2)
D1 = (MID$(SUM$, 1, 1) < MID$(SUM$, 2, 1))
D2 = (MID$(SUM$, 2, 1) < MID$(SUM$, 3, 1))
D3 = (MID$(SUM$, 3, 1) < MID$(SUM$, 4, 1))
IF D1 AND D2 AND D3 THEN
PRINT P(I); "+"; P(J); "+"; P(K); "="; TOT
DISP = DISP + 1: IF DISP = 7 THEN END
END IF
END IF
END IF
NEXT K
NEXT J
NEXT I
'3.9
' This program will produce a binary search tree.
'
DIM A$(8, 256)
DATA 0,15,7,3,1,0,0,0,0,0
FOR I = 0 TO 8: READ COLINC(I): NEXT I
CLS : INPUT "Enter word(s):"; WORDS$
CLS
FOR I = 1 TO LEN(WORDS$)
CH$ = MID$(WORDS$, I, 1)
IF CH$ <> " " THEN
R = 0: C = 1: COL = 40
' Traverse tree until an empty node exists
WHILE A$(R, C) <> ""
IF CH$ <= A$(R, C) THEN
C = 2 * C - 1: COL = COL - COLINC(R + 1) - 1
ELSE
C = 2 * C
PREVCOL = COL
COL = COL + COLINC(R + 1) + 1
END IF
R = R + 1
WEND
A$(R, C) = CH$
'
LOCATE R + 1, COL
IF R = 0 THEN
PRINT CH$;
ELSE
IF C MOD 2 = 1 THEN
PRINT CH$; STRING$(COLINC(R), "-"); "+";
ELSE
LOCATE R + 1, PREVCOL
PRINT "+"; STRING$(COLINC(R), "-"); CH$;
END IF
END IF
END IF
NEXT I
'3.10
' This program will determine the values F(X) converges.
'
DIM F#(5000)
FOR I = 1 TO 2
IF I = 1 THEN INC# = .01 ELSE INC# = .1
DIVERGE = 0: FACTOR# = 1: FOUND = 0
WHILE (K# < 10) AND NOT FOUND
K# = K# + INC# / FACTOR#
X = 1: F#(X) = K#
IF FACTOR# < 20 THEN ITER = 250 * FACTOR# ELSE ITER = 5000
WHILE (X < ITER) AND NOT DIVERGE
X = X + 1
F#(X) = EXP(LOG(K#) * F#(X - 1))
DIVERGE = (F#(X) > 9.9)
WEND
IF I = 1 THEN
FX2# = FX1#: FX1# = FX0#: FX0# = F#(X)
IF (FX2# > FX1#) AND (FX1# < FX0#) THEN
K# = K# - 2 * INC# / FACTOR#
IF (FX2# - FX1#) < .0005 THEN FOUND = -1: FX# = FX1#
FX0# = FX2#: FX1# = FX0#
FACTOR# = FACTOR# * 2
END IF
ELSE
' Find Maximum point
IF DIVERGE THEN
DIVERGE = 0
K# = K# - INC# / FACTOR#
IF INC# / FACTOR# < .000005 THEN FOUND = -1
FACTOR# = FACTOR# * 2
ELSE
FX# = F#(X)
END IF
END IF
WEND
IF I = 1 THEN PRINT "MINIMUM"; ELSE PRINT "MAXIMUM";
PRINT " VALUE: ";
IF I = 1 THEN
PRINT USING "F(X) = #.###"; FX#; : PRINT " OCCURS WHEN ";
PRINT USING "K = #.###"; K# + INC# / FACTOR#
ELSE
PRINT USING "F(X) = #.#"; FX#; : PRINT " OCCURS WHEN ";
PRINT USING "K = #.#####"; K# + INC# / FACTOR#
END IF
NEXT I