Fractions: Hard for Youngsters and a Problem for Programming

See all articles from Update April 1988

Those of you who have had to help your children with fractions in arithematic have probaby wished you had a driller for them. The following program can provide that driller and its two major subroutines can be used as a basis for your own program.

The Greatest Common Multiplier (GCM) routine uses an old trick to quickly find the GCM to enable finding the reduced form of a product and to enable adding and subtracting. It only uses two compound lines, 100 and 110, to accomplish this feat.

The program is self explanitory when RUN and I have placed comments where I thought a pointer might help. In line 9, CONSTANT is assigned a value of 10 but it can be changed as needed for your youngster. It sets the upper value limit for the numerator and denominator. In line 1990, the problem loop is set to 25 iterations and this can be changed as you see fit.

The scores are saved in a sequential file for your viewing any time. This file has to be started with the command line:

PRINT #4: OPEN #5,"scores":: PRINT #5;"SCORES":PRINT #4: CLOSE #5

This will initialize the file to contain the word ‘SCORES’. The second program will read this file to the screen or to a printer when you want to see it.

   1 REM
@1986 K.I.S.S./softstuff
Munson H. Cockayne, Jr. BSCS
2 ON ERR GO TO 7: PRINT #4: OPEN # 5,"scores"
3 PRINT #4: OPEN # 6,"temp"
4 INPUT #5;a$
5 PRINT #6;a$
6 GO TO 4
7 ON ERR RESET : PRINT #4: CLOSE # 5:: PRINT #4: ERASE "scores",
9 LET CONSTANT=10: REM THIS SETS UPPER LIMIT OF FRACTION COMPONENTS
10 GO TO 1500
99 REM
THIS ROUTINE (LINES 100 TO 110) RETURNS THE GREATEST COMMON DIVISOR THAT EXISTS FOR THE PAIR OF INTEGERS IN M AND N.
100 IF NOT INT n THEN LET gcd= ABS m: RETURN
110 LET t= INT (m-n* INT (m/n)+.005): LET m=n: LET n=t: GO TO 100
199 REM
THIS ROUTINE PRODUCES TWO DISSIMILAR INTEGERS FOR MAKING A FRACTION.
200 LET N= INT ( RND *CONSTANT)+1
210 LET D= INT ( RND *CONSTANT)+1
220 IF N=D THEN GO TO 200
230 RETURN
299 REM
THIS ROUTINE PRINTS A FRACTION AT THE COORDINATE X,Y [UPPER RIGHT HAND CORNER] USING NUMINATOR AND DENOMERATOR.
300 PRINT AT X,Y+2*( LEN STR$ NUMERATOR=1)+( LEN STR$ NUMERATOR=2);NUMERATOR
310 REM PLOT 112,88: DRAW 24,0
311 PLOT Y*8,175-(X+1)*8+1: DRAW 24,0
320 PRINT AT X+1,Y+2*( LEN STR$ DENOMINATOR=1)+( LEN STR$ DENOMINATOR=2);DENOMINATOR
330 RETURN
1499 REM
THIS ROUTINE IS THE MAIN BODY
FOR THE FRACTION ARITHEMATIC
PRACTICE.
1500 CLS
1505 POKE 23692,255
1510 PRINT AT 21,0;"YOU ARE TO PERFORM DESIGNATED OPERATIONS ON THE FOLLOWING FRACTIONS. ADDITION, SUBTRACTION, MULTIPLICATION, AND DIVISION WILL ALL BE PRESENTED RANDOMLY."
1520 PRINT ''"PRESS A KEY TO CONTINUE"
1530 PAUSE 0
1540 CLS
1550 RANDOMIZE
1570 LET RIGHT=0
1990 FOR I=1 TO 25: REM THIS IS PROBLEM LOOP (25 ITERATIONS)
2000 DRAW 255,0: DRAW 0,175: DRAW -255,0: DRAW 0,-175
2001 BORDER 4: INPUT ;
2002 BEEP .1,20: BEEP .2,10
2010 PRINT AT 1,11;"FRACTIONS"; AT 2,6;"A PRACTICE SESSION"
2020 PLOT 0,141: DRAW 255,0
2100 GO SUB 200
2110 LET X=10: LET Y=14: LET NUMERATOR=N: LET DENOMINATOR=D: GO SUB 300
2140 LET N1=N: LET D1=D
2150 GO SUB 200
2160 LET X=13: LET NUMERATOR=N: LET DENOMINATOR=D: GO SUB 300
2170 LET N2=N: LET D2=D
2190 PLOT 112,52: DRAW 24,0
2191 PLOT 112,51: DRAW 24,0
2200 LET FUNCTION= INT ( RND *4)+1
2201 IF FUNCTION=1 THEN GO SUB 3000
2202 IF FUNCTION=2 THEN GO SUB 3100
2203 IF FUNCTION=3 THEN GO SUB 3200
2204 IF FUNCTION=4 THEN GO SUB 3300
2210 INPUT AT 1,0;"ENTER NUMERATOR"; AT 0,0;NUM
2220 INPUT AT 1,0;"ENTER DENOMINATOR"; AT 0,0;DENOM
2225 IF ((FUNCTION=2) AND (N1/D1<N2/D2)) THEN LET AN=-AN
2230 IF (NUM=AN AND DENOM=AD) OR (NUM=AN/GCD AND DENOM=AD/GCD) THEN GO TO 5000
2240 GO TO 6000
2800 PRINT #1;"PRESS A KEY TO CONTINUE"
2810 PAUSE 0
2820 CLS
2990 NEXT I
2991 PRINT #6;RIGHT
2992 PRINT #4: CLOSE # 6
2993 PRINT #4: MOVE "temp","scores"
2994 STOP
3000 PRINT AT 8,15;"ADD"
3010 LET N=D1: LET M=D2: GO SUB 100
3015 LET N=N1*D2
3020 LET M=N2*D1
3025 LET AN=M+N: LET AD=D1*D2
3030 LET N=AN
3040 LET M=AD
3050 GO SUB 100
3060 RETURN
3100 PRINT AT 8,12;"SUBTRACT"
3110 LET N=D1: LET M=D2: GO SUB 100
3115 LET N=N1*D2
3120 LET M=N2*D1
3125 LET AN= ABS (M-N): LET AD=D1*D2
3130 GO TO 3030
3200 PRINT AT 8,12;"MULTIPLY"
3210 LET AN=N1*N2
3220 LET AD=D1*D2
3230 GO TO 3030
3300 PRINT AT 8,13;"DIVIDE"
3310 LET AN=N1*D2
3320 LET AD=D1*N2
3330 GO TO 3030
5000 LET RIGHT=RIGHT+1
5010 LET X=17: LET DENOMINATOR=DENOM: LET NUMERATOR=NUM: GO SUB 300
5020 LET N=NUM: LET M=DENOM: GO SUB 100
5030 IF GCD <> 1 THEN LET DENOMINATOR=DENOM/GCD: LET NUMERATOR=NUM/GCD: LET Y=20: PRINT AT 17,18;"=": GO SUB 300
5040 GO TO 2800
6000 BEEP .5,-10
6010 PRINT AT 20,13; BRIGHT 1;"WRONG"
6015 PRINT #1;"PRESS A KEY FOR RIGHT ANSWER": PAUSE 0: INPUT ;
6020 LET X=17: LET DENOMINATOR=AD: LET NUMERATOR=AN: GO SUB 300
6030 PRINT AT 17,5; FLASH 1;"RIGHT =>"
6040 LET M=AD: LET N=AN: GO SUB 100
6050 IF GCD <> 1 THEN LET DENOMINATOR=AD/GCD: LET NUMERATOR=AN/GCD: LET Y=20: PRINT AT 17,18;"=": GO SUB 300
6060 GO TO 5040
   1 REM
@1986 K.I.S.S./softstuff
Munson H. Cockayne, Jr. BSCS
10 CLS
20 PRINT #4: OPEN #5,"scores"
30 PRINT #1;"1) To screen"'"2) To printer": PAUSE 0: LET r$= INKEY$ : INPUT ;: IF r$ <> "1" AND r$ <> "2" THEN GO TO 30
40 IF r$="1" THEN OPEN # 2,"s"
50 IF r$="2" THEN OPEN # 2,"p"
60 ON ERR GO TO 120
70 INPUT #5;a$
80 PRINT a$
90 INPUT #5;a$
100 PRINT ,a$
110 GO TO 90
120 ON ERR RESET
130 PRINT #4: CLOSE #5
140 CLOSE #2

Well, that’s it for now. Questions to:

342 Trotter Court,
Sanford, FL 32773.

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.