10  REM**C.A.I.**CHEM1**CHEMISTRY DRILL**MAY 19, 1972
15  REM HP 36878A, 6/74
20  K2=T=1
30  S=S2=K1=T1=T2=0
40  S3=S4=100
50  MAT Q=ZER
60  FILES REC1,$EX1,$EX2,$EX3
70  DIM I$[10],R$[72],O$[20],P$[20],A$[72],E$[72]
80  DIM N$[20],B$[20],C$[20],Q[200],F$[72]
90  Z0=TIM(0)
100  Z1=TIM(1)
110  Z2=TIM(2)
120  REM RECORD THE BEGINNING TIME
130  PRINT "GENERAL IDENTIFICATION PROGRAM"
140  PRINT "------------------------------"
150  PRINT 
160  PRINT "     IF YOU WANT INSTRUCTIONS TYPE 'STOP' AFTER THE QUESTION"
170  PRINT "     MARK AND CONSULT DOCUMENTATION.  OTHERWISE, INPUT 'GO'"
180  PRINT "     AFTER THE QUESTION MARK";
190  INPUT I$
200  IF I$="STOP" THEN 4020
210  REM IDENTIFICATION ROUTINE
220  PRINT 
230  PRINT 
240  PRINT 
250  PRINT "STUDENT INFORMATION"
260  PRINT "-------------------"
270  PRINT 
280  PRINT "YOUR NAME :";
290  INPUT R$
300  REM
310  PRINT "CHOOSE TOPIC 2 OR 3.  WHICH DO YOU WANT";
320  INPUT D
330  READ #D,1
340  READ #D;O$
350  K1=K1+1
360  IF O$#"ORDER" THEN 390
370  READ #D;N$,P$
380  K1=K1+2
390  READ #D;A
400  K1=K1+1
410  FOR I=1 TO A
420  READ #D;A[I]
430  K1=K1+1
440  NEXT I
450  REM
460  IF O$="ORDER" THEN 490
470  B$="NONE"
480  GOTO 520
490  PRINT "ORDER ("N$" OR ""):";
500  INPUT B$
510  IF B$=P$ THEN 540
520  C=1
530  GOTO 560
540  C=2
550  REM ONLY ONE ANSWER IN REVERSE ORDER
560  L1=A[A]
570  REM
580  PRINT "LEVEL -- (1 TO "A") --";
590  INPUT D1
600  LET D1=INT(D1)
610  IF D1 <= A THEN 640
620  PRINT "LEVEL NUMBER IS TOO LARGE -- RETYPE IT"
630  GOTO 580
640  IF D1#1 THEN 670
650  H1=1
660  GOTO 680
670  H1=A[D1-1]+1
680  LET H2=A[D1]
690  REM UPPER LIMIT IS SET
700  REM
710  REM EXHAUST THE RECORD LIST
720  PRINT "LIST OF COMMANDS:"
730  FOR I=1 TO 11
740  READ C$
750  PRINT C$;"--";
760  NEXT I
770  DATA "WRONG","END","STOP","LEVEL","SCORE","TIME"
780  DATA "NUMBER","ORDER","RTIME","REPEAT","IDENT"
790  PRINT 
800  RESTORE 
810  PRINT 
820  REM
830  REM
840  REM
850  REM BEGINNING OF QUESTION AND ANSWER ROUTINE (MAIN DRILL)
860  REM
870  REM
880  PRINT 
890  PRINT 
900  PRINT "MAIN EXERCISE"
910  PRINT "-------------"
920  PRINT 
930  IF K2>H2-H1+1 THEN 4030
940  I=INT(RND(0)*(H2-H1+1))+H1
950  FOR J=1 TO K2-1
960  IF ABS(Q[J])=I THEN 940
970  NEXT J
980  Q[K2]=I
990  K2=K2+1
1000  READ #D,1
1010  IF K1-A>2 THEN 1040
1020  READ #D;A$,A1
1030  GOTO 1050
1040  READ #D;A$,A$,A$,A1
1050  FOR J=1 TO A
1060  READ #D;A1
1070  NEXT J
1080  FOR J=1 TO I-1
1090  READ #D;A$,A1
1100  FOR J1=1 TO A1
1110  READ #D;A$
1120  NEXT J1
1130  NEXT J
1140  IF C=2 THEN 1170
1150  READ #D;F$,A1
1160  GOTO 1180
1170  READ #D;E$,A1,F$
1180  IF T1#0 THEN 1200
1190  PRINT "QUEST. #"T":";F$;
1200  INPUT A$
1210  IF C=2 THEN 1280
1220  FOR J=1 TO A1
1230  READ #D;E$
1240  IF A$=E$ THEN 1320
1250  GOSUB 1450
1260  NEXT J
1270  GOTO 1400
1280  IF A$=E$ THEN 1320
1290  GOSUB 1450
1300  GOTO 1400
1310  REM
1320  REM SCORE 1 PT. FOR CORRECT RESPONSE
1330  LET S=S+1
1340  T1=0
1350  T=T+1
1360  REM SHOW THAT THIS QUESTION HAS BEEN ASKED
1370  GOTO 930
1380  REM GO GET THE NEXT QUESTION
1390  REM
1400  REM WRONG ANSWER ROUTINE
1410  GOTO 1730
1420  REM GO SEE IF THE RESPONSE WAS A COMMAND
1430  REM
1440  REM
1450  REM MISSPELLING??
1460  B=0
1470  FOR K=1 TO LEN(E$) MIN LEN(A$)
1480  IF A$[K,K]#E$[K,K] THEN 1500
1490  B=B+1
1500  NEXT K
1510  IF B/LEN(E$)<.5 THEN 1530
1520  PRINT " ----- MISSPELLED."
1530  RETURN 
1540  REM
1550  REM IT MUST BE AN ERROR
1560  LET T1=T1+1
1570  REM INCREMENT # OF TRIES BY 1
1580  IF T1<3 THEN 1690
1590  T=T+1
1600  LET T1=0
1610  REM RESET FLAGS
1620  Q[K2-1]=-1*Q[K2-1]
1630  REM RECORD THAT A QUESTION WAS MISSED
1640  PRINT "CORRECT ANSWER -- "E$;'13;"                  ";
1650  PRINT "AAAAAAAAAAAAAAAAAAAAAAAAA";'13;
1660  PRINT "                  BBBBBBBBBBBBBBBBBBBBBBBBB"
1670  GOTO 930
1680  REM GOTO THE ANSWER INPUT STATEMENT
1690  PRINT "     TRY AGAIN";
1700  GOTO 1000
1710  REM  GOTO THE ANSWER INPUT STATEMENT
1720  REM
1730  REM COMMAND ROUTINE -- FIRST CHECK TO SEE IF IT IS A COMMAND
1740  REM
1750  FOR J=1 TO 11
1760  READ C$
1770  IF C$=A$ THEN 1820
1780  REM IF IT IS A COMMAND -- JUMP
1790  NEXT J
1800  RESTORE 
1810  GOTO 1550
1820  RESTORE 
1830  GOTO J OF 1840,1880,1930,1990,2270,2330,2420,2520,2810,2860,2910
1840  REM WRONG COMMAND
1850  GOTO 1590
1860  REM GO TO BE COUNTED WRONG
1870  REM
1880  REM END COMMAND -- COMMAND TO START OUT ROUTINE
1890  LET T=T-1
1900  REM DO NOT COUNT THE QUESTION WE ARE ON
1910  GOTO 3100
1920  REM
1930  REM STOP COMMAND -- COMMAND TO STOP THE PROGRAM WITHOUT THE OUT ROUTINE
1940  LET T=T-1
1950  REM DO NOT COUNT THE QUESTION WE ARE ON
1960  GOTO 3790
1970  REM GO TO THE FINALIZATION ROUTINE
1980  REM
1990  REM LEVEL COMMAND -- USED TO CHANGE THE LEVEL OF WORK DURING RUN
2000  IF A>1 THEN 2030
2010  PRINT "LEVEL CAN'T BE CHANGED -- SORRY"
2020  GOTO 1000
2030  LET T=T-1
2040  REM DO NOT COUNT THE QUESTION WE ARE ON
2050  IF T=0 THEN 2090
2060  LET S3=INT(S/T*100+.5)
2070  PRINT #1;R$,D,B$,D1,Z0,Z1,Z2,T,S3
2080  PRINT #1;TIM(0),TIM(1),TIM(2)
2090  K2=T=1
2100  S3=100
2110  S=T1=0
2120  PRINT 
2130  PRINT "NEW LEVEL --";
2140  INPUT D1
2150  IF D1 <= A THEN 2180
2160  PRINT "LEVEL NUMBER IS TOO LARGE -- RETYPE IT"
2170  GOTO 2130
2180  IF D1#1 THEN 2210
2190  H1=1
2200  GOTO 2220
2210  H1=A[D1-1]+1
2220  LET H2=A[D1]
2230  PRINT "LEVEL CHANGED -- NEW BALL GAME"
2240  GOTO 880
2250  REM START THE MAIN DRILL ROUTINE AGAIN
2260  REM
2270  REM SCORE COMMAND -- USED TO FIND OUT SCORE THUS FAR IS RUN
2280  PRINT 
2290  PRINT S;" OUT OF";T-1;" ";INT(S/(T-1)*100+.5);"%"
2300  PRINT 
2310  GOTO 1000
2320  REM
2330  REM TIME COMMAND -- USED TO FIND THE TIME AT PRESENT
2340  PRINT 
2350  REM SKIP A LINE
2360  PRINT "BEGAN AT:"Z0"MIN."Z1"HRS."Z2"DAYS."
2370  PRINT "TIME NOW IS: "TIM(0)"MIN."TIM(1)"HRS."TIM(2)"DAYS."
2380  PRINT 
2390  REM SKIP A LINE
2400  GOTO 1000
2410  REM
2420  REM NUMBER COMMAND -- USED TO FIND THE # OF POSSIBLE QUESTIONS
2430  PRINT 
2440  REM SKIP A LINE
2450  PRINT "TOTAL # OF QUESTIONS :";L1
2460  PRINT "# OF QUESTIONS IN LEVEL "D1": ";H2-H1+1
2470  PRINT "# OF QUESTIONS ASKED :";T
2480  PRINT 
2490  REM SKIP A LINE
2500  GOTO 1000
2510  REM
2520  REM ORDER COMMAND -- USED TO CHANGE THE ORDER OF THE QUESTION
2530  IF O$="ORDER" THEN 2560
2540  PRINT "ORDER CAN'T BE CHANGED -- SORRY"
2550  GOTO 1000
2560  LET T=T-1
2570  IF T=0 THEN 2630
2580  REM IF WE HAVEN/T STARTED, DON/T WRITE FILE
2590  LET S3=INT(S/T*100+.5)
2600  REM COMPUTE AVERAGE ON MAIN DRILL
2610  PRINT #1;R$,D,B$,D1,Z0,Z1,Z2,T,S3,TIM(0),TIM(1),TIM(2)
2620  REM
2630  PRINT "NEW ORDER --";
2640  INPUT B$
2650  IF B$=N$ THEN 2690
2660  IF B$=P$ THEN 2710
2670  PRINT "ILLEGAL ORDER -- CHECK ORDER LIST ABOVE AND RETYPE IT"
2680  GOTO 2630
2690  C=1
2700  GOTO 2720
2710  C=2
2720  MAT Q=ZER
2730  REM RESET Q ARRAY FOR NEW GAME
2740  PRINT "ORDER CHANGED -- NEW BALL GAME"
2750  PRINT 
2760  S=T1=0
2770  S3=100
2780  K2=T=1
2790  GOTO 850
2800  REM
2810  REM RTIME COMMAND -- USED TO FIND ELAPSED RUN TIME
2820  PRINT 
2830  PRINT "ELAPSED RUN TIME :"TIM(1)*60+TIM(0)-Z1*60-Z0"MIN."
2840  GOTO 1000
2850  REM
2860  REM REPEAT COMMAND -- REPEAT THE QUESTION (ONLY)
2870  IF T1=0 THEN 1000
2880  PRINT "QUEST. #";T;": ";F$
2890  GOTO 1000
2900  REM
2910  REM IDENT COMMAND -- IDENTIFY THE USER AND PROBLEM
2920  PRINT 
2930  PRINT "NAME : ";R$
2940  PRINT "TOPIC: ";D
2950  PRINT "ORDER : ";B$
2960  PRINT "LEVEL : ";D1
2970  PRINT "# OF QUESTIONS ASKED : "T
2980  IF T=1 THEN 3010
2990  LET S3=INT(S/(T-1)*100+.5)
3000  GOTO 3020
3010  S3=100
3020  PRINT "SCORE :"S3
3030  PRINT "BEGAN AT :"Z0"MIN."Z1"HRS."Z2"DAYS."
3040  PRINT "TIME IS: "TIM(0)"MIN."TIM(1)"HRS."TIM(2)"DAYS."
3050  PRINT "ELAPSED RUN TIME :"TIM(1)*60+TIM(0)-Z1*60-Z0"MIN."
3060  PRINT 
3070  GOTO 1000
3080  REM
3090  REM
3100  REM OUT ROUTINE -- REPEAT MISSED QUESTIONS BEFORE FINISHING
3110  REM  (REDRILL)
3120  REM
3130  FOR J=1 TO A[A]
3140  IF Q[J]<0 THEN 3200
3150  REM WRONG OR MISSPELLED (-1/2)
3160  NEXT J
3170  PRINT "YOU MISSED NO QUESTIONS -- PERFECT SCORE"
3180  GOTO 3790
3190  REM
3200  REM START ASKING QUESTION
3210  PRINT 
3220  S4=100
3230  PRINT "RETEST"
3240  PRINT "------"
3250  S2=T2=0
3260  PRINT 
3270  PRINT "FINISHING UP -- ONLY ONE TRY ON THE FOLLOWING QUESTIONS"
3280  PRINT 
3290  FOR J=1 TO L1
3300  REM CHECK ALL THE QUESTIONS
3310  IF Q[J] >= 0 THEN 3700
3320  REM HAS THE QUESTION BEEN MISSED?
3330  LET T2=T2+1
3340  READ #D,1
3350  IF K1-A>2 THEN 3390
3360  REM COUNT THE QUESTION ASKED AGAIN
3370  READ #D;A$,A1
3380  GOTO 3400
3390  READ #D;A$,A$,A$,A1
3400  FOR K=1 TO A
3410  READ #D;A1
3420  NEXT K
3430  FOR K=1 TO ABS(Q[J])-1
3440  READ #D;A$,A1
3450  FOR J1=1 TO A1
3460  READ #D;A$
3470  NEXT J1
3480  NEXT K
3490  IF C=2 THEN 3520
3500  READ #D;F$,A1
3510  GOTO 3530
3520  READ #D;E$,A1,F$
3530  PRINT "QUEST. # "T2": ";F$;
3540  INPUT A$
3550  IF C=2 THEN 3620
3560  REM INCORRECT ANSWER
3570  FOR K=1 TO A1
3580  READ #D;E$
3590  IF A$=E$ THEN 3650
3600  NEXT K
3610  GOTO 3630
3620  IF A$=E$ THEN 3650
3630  IF A$="STOP" THEN 3740
3640  GOTO 3680
3650  PRINT "CORRECT"
3660  S2=S2+1
3670  GOTO 3700
3680  PRINT "WRONG.  CORRECT ANSWER IS: ";
3690  PRINT E$
3700  NEXT J
3710  GOTO 3790
3720  REM FINALIZE
3730  REM
3740  REM STOP ROUTINE FOR THE OUT ROUTINE
3750  LET T2=T2-1
3760  REM DO NOT COUNT THE QUESTION AT HAND
3770  REM
3780  REM
3790  REM FINALIZATION ROUTINE
3800  S4=100
3810  IF T=0 THEN 3840
3820  LET S3=INT(S/T*100+.5)
3830  REM % SCORE ON MAIN ROUTINE
3840  IF T2=0 THEN 3880
3850  REM SKIP AVERAGE FOR REDRILL IF NOT DONE
3860  LET S4=INT(S2/T2*100+.5)
3870  REM % SCORE ON REDRILL
3880  REM WRITE FILE RECORD HERE
3890  PRINT #1;R$,D,B$,D1,Z0,Z1,Z2,T,S3,TIM(0),TIM(1),TIM(2)
3900  PRINT #1;T2,S4
3910  PRINT 
3920  PRINT 
3930  PRINT "THE DRILL IS OVER"
3940  PRINT 
3950  PRINT "MAIN DRILL ";S;" CORRECT OUT OF ";T;" FOR SCORE OF";S3;"%"
3960  PRINT 
3970  PRINT "REDRILL: ";S2;" CORRECT OUT OF";T2;" FOR SCORE OF";S4"%"
3980  REM
3990  REM
4000  PRINT 
4010  PRINT "GOODBYE"
4020  STOP 
4030  T=T-1
4040  GOTO 3100
4050  END 
