10  REM  MARK-SENSE SCORER FOR AN HP-2761B OPTICAL READER USING 
20  REM  HP 9320-2062 (IBM B96723) CARDS AND AN HP-2600A CRT,
30  REM  COPYRIGHT JUNE 11, 1974 BY WILLIAM K. CHAR.
40  REM  INSTRUCTIONS UPDATED 2/18/76 BY MARC MUELLER
50  DIM A$[38],B$[72],F$[10],Q$[10]
60  DIM A[25],F[5],L[5],M[5,25],N[5,25],P[500],Q[500],X[5,25]
70  FILES *
80  REM
90  PRINT "INSTRUCTION";
100  INPUT A$
110  IF A$[1,1]="N" THEN 430
120  IF A$[1,1] <> "Y" THEN 90
130  PRINT 
140  PRINT "SCORE INSTRUCTIONS"
150  PRINT 
160  PRINT "1. OPEN A FILE OF ANY NAME TO A LENGTH OF AT LEAST ONE RECORD"
170  PRINT "      FOR EVERY 16 CARDS.  EXAMPLE: 'OPE-FILE-1,10"
180  PRINT 
190  PRINT "2. CHECK THE 'KEY' CARDS (THE CARDS WITH THE SCORING KEY) TO"
200  PRINT "      MAKE SURE THE SECTION OF THE CARDS LABLED 'STUDENT NUMBER'"
210  PRINT "      HAS ALL THE ZERO SPOTS PENCILED IN."
220  PRINT 
230  PRINT "3. LOAD THE CARD HOPPER WITH THE CARDS. DO NOT TURN THE CARD"
240  PRINT "      READER ON YET."
250  PRINT 
260  PRINT "4. FOLLOW ALL DIRECTIONS AND ANSWER ALL QUESTIONS APPROPRIATLY"
270  PRINT 
280  PRINT "5. ERRORS ARE SIGNALED BY SEVERAL AUDIBLE 'BLEEPS'. CHECK BAD"
290  PRINT "      CARDS AND REPLACE THEM IN THE HOPPER TO BE READ AGAIN."
300  PRINT 
310  PRINT "6. TURN THE CARD READER OFF AFTER THE LAST CARD HAS BEEN READ"
320  PRINT 
330  PRINT "7. TYPE 'END' VIA THE KEYBOARD TO SIGNAL THAT THE LAST OF THE"
340  PRINT "      CARDS HAS BEEN READ."
350  PRINT "      *** DO NOT USE 'CTRL-C' *** IT RUINS THE FILE."
360  PRINT 
370  PRINT "8. IF YOU ARE NOT ON A PRINTING TERMINAL GOTO ONE AND RUN THIS"
380  PRINT "      SAME PROGRAM SCORING INSTEAD."
390  PRINT 
400  PRINT "9. IF THERE ARE ANY QUESTIONS CHECK THE SAMPLE RUNNING OF THIS"
410  PRINT "      PROGRAM IN THE LIBRARY MASTER FILE FOLDER, OR ASK ONE"
420  PRINT "      OF THE CENTER'S PERSONNEL."
430  PRINT LIN(-2)
440  PRINT "FILE NAME";
450  INPUT A$
460  ASSIGN A$,1,R
470  IF R <> 3 THEN 500
480  PRINT "READ OR WRITE IMPOSSIBLE ON THIS FILE"
490  GOTO 440
500  PRINT "CARDS PER STUDENT";
510  INPUT G1
520  IF G1<1 OR G1>5 THEN 500
530  PRINT "READ, SCORE OR EXIT";
540  INPUT A$
550  IF A$[1,1]="E" THEN 3870
560  IF A$[1,1]="S" THEN 1360
570  IF A$[1,1] <> "R" THEN 530
580  REM     ===== READING SECTION =====
590  PRINT "MAX STUDENT NO.";
600  INPUT G2
610  IF G2<1 OR G2>9999 THEN 590
620  PRINT "MAX SECTION NO.";
630  INPUT G3
640  IF G3<0 OR G3>999 THEN 620
650  REM     (SOMETHING ON FILE)
660  READ #1,1
670  IF TYP(1)=3 THEN 760
680  PRINT "SOMETHING ON FILE--ERASE IT";
690  INPUT A$
700  IF A$[1,1]="Y" THEN 760
710  IF A$[1,1] <> "N" THEN 680
720  IF TYP(1)=3 THEN 760
730  READ #1;F1,F2,F3
740  MAT  READ #1;F
750  GOTO 720
760  PRINT 
770  PRINT '7"."'7"."'7"."'7"START READER"'7"."'7"."'7"."'7
780  ENTER 20,R,A$
790  PRINT 
800  IF R=-256 THEN 780
810  IF A$="END" THEN 530
820  IF LEN(A$)=38 THEN 850
830  PRINT '7'7"."'7'7"."'7'7".WRONG LENGTH="'7'7LEN(A$);
840  GOTO 1330
850  E=F2=F3=0
860  F1=1
870  REM     (CARD NUMBER)
880  IF G1=1 THEN 960
890  F$="13579"
900  FOR F1=1 TO 5
910  IF A$[1,1]=F$[F1,F1] THEN 960
920  NEXT F1
930  PRINT '7'7"."'7'7"."'7'7".ILLEGAL CARD NUMBER";
940  E=1
950  REM     (CONVERTS TO NUMERICS)
960  Q$="02468"
970  FOR I=2 TO 26
980  FOR J=1 TO 5
990  IF A$[I,I]=Q$[J,J] THEN 1010
1000  NEXT J
1010  A[I-1]=J
1020  NEXT I
1030  REM     (PACK ROUTINE)
1040  MAT F=ZER
1050  FOR I=1 TO 5
1060  FOR J=1 TO 5
1070  F[I]=F[I]*10+A[I*5+J-5]
1080  NEXT J
1090  NEXT I
1100  REM     (SECTION NUMBER)
1110  K=36
1120  L=38
1130  GOSUB 3590
1140  F3=G
1150  IF F3 <= G3 THEN 1190
1160  PRINT '7"."'7"."'7"."'7"I"'7"L"'7"L"'7"E"'7"G"'7"A"'7"L"'7" SECTION NUMBER";
1170  E=1
1180  REM     (STUDENT NUMBER)
1190  IF A$[27,35]="000000000" THEN 1280
1200  IF A$[27,35]="999999999" THEN 1280
1210  K=27
1220  L=35
1230  GOSUB 3590
1240  F2=G
1250  IF F2>0 AND F2 <= G2 THEN 1280
1260  PRINT '7"."'7"."'7"."'7"I"'7"L"'7"L"'7"E"'7"G"'7"A"'7"L"'7" STUDENT NUMBER";
1270  E=1
1280  IF E THEN 1330
1290  PRINT #1;F1,F2,F3
1300  MAT  PRINT #1;F
1310  PRINT #1; END 
1320  GOTO 780
1330  PRINT "."'7'7"."'7'7"."'7'7"S"'7'7"K"'7'7"I"'7'7"P"'7'7"P"'7'7"I"'7"N"'7'7"G"'7'7" "'7'7"C"'7'7"A"'7'7"R"'7'7"D"'7'7'7
1340  GOTO 760
1350  REM     ===== SCORING SECTION =====
1360  PRINT "TEST TITLE";
1370  INPUT B$
1380  PRINT 
1390  PRINT "TABULATING FILE, PLEASE WAIT."
1400  MAT L=ZER
1410  MAT M=ZER
1420  MAT X=ZER
1430  P=0
1440  READ #1,1
1450  IF TYP(1)=3 THEN 1650
1460  READ #1;F1,F2,F3
1470  MAT  READ #1;F
1480  IF F2=0 THEN 1580
1490  IF P=0 THEN 1540
1500  IF F2=P[P] THEN 1450
1510  FOR K=1 TO P
1520  IF F2=P[K] THEN 1450
1530  NEXT K
1540  P=P+1
1550  P[P]=F2
1560  GOTO 1450
1570  REM  (KEY INITIALIZATION)
1580  L[F1]=L[F1]+1
1590  GOSUB 3490
1600  FOR K=1 TO 25
1610  M[F1,K]=A[K]
1620  NEXT K
1630  GOTO 1450
1640  REM  ===== KEY PRINTOUT =====
1650  IF P THEN 1690
1660  PRINT 
1670  PRINT "*** THERE IS NOTHING ON THIS FILE ***"
1680  GOTO 530
1690  PRINT LIN(-5)"TEST FOR "B$
1700  PRINT 
1710  PRINT "KEY AS FOLLOWS:"
1720  PRINT 
1730  PRINT "            TRIES 12345 67890 12345 67890 12345"
1740  PRINT "            ===== ===== ===== ===== ===== ====="
1750  F$="ABCDE."
1760  A=E=0
1770  FOR K=1 TO G1
1780  PRINT "            "L[K];
1790  IF L[K] THEN 1820
1800  E=1
1810  GOTO 1900
1820  FOR L=1 TO 25
1830  M=M[K,L]
1840  PRINT F$[M,M];
1850  IF M>5 THEN 1870
1860  A=A+1
1870  IF L-INT(L/5)*5 THEN 1890
1880  PRINT " ";
1890  NEXT L
1900  PRINT 
1910  NEXT K
1920  PRINT 
1930  PRINT "TEST CONTAINS  "A"QUESTIONS ON  "G1"CARDS FOR  "P"STUDENTS."
1940  IF E=0 THEN 2010
1950  PRINT 
1960  PRINT "ERROR IN KEY.  DO I CONTINUE";
1970  INPUT A$
1980  IF A$[1,1]="N" THEN 500
1990  IF A$[1,1] <> "Y" THEN 1960
2000  REM  ===== STUDENT PRINTOUT =====
2010  PRINT 
2020  PRINT "STDNT SECTN TRIES 12345 67890 12345 67890 12345 RIGHT PERCT"
2030  FOR K=1 TO 10
2040  PRINT "===== ";
2050  NEXT K
2060  PRINT 
2070  F$="ABCDE "
2080  FOR K=1 TO P
2090  MAT L=ZER
2100  B=E=0
2110  P2=P[K]
2120  Q[K]=-1
2130  READ #1,1
2140  IF TYP(1)=3 THEN 2260
2150  READ #1;F1,F2,F3
2160  MAT  READ #1;F
2170  IF F2#P2 THEN 2140
2180  L[F1]=L[F1]+1
2190  P3=F3
2200  GOSUB 3490
2210  FOR L=1 TO 25
2220  N[F1,L]=A[L]
2230  NEXT L
2240  GOTO 2140
2250  REM     (STUDENT PRINT-OUT)
2260  PRINT 
2270  FOR L=1 TO G1
2280  PRINT P2;P3;
2290  IF L[L]=1 THEN 2340
2300  PRINT L[L];
2310  IF L[L] THEN 2350
2320  E=1
2330  GOTO 2580
2340  PRINT "      ";
2350  FOR L1=1 TO 25
2360  N=N[L,L1]
2370  PRINT F$[N,N];
2380  IF L1-INT(L1/5)*5 THEN 2400
2390  PRINT " ";
2400  NEXT L1
2410  PRINT 
2420  PRINT TAB(13)"ERRS=";
2430  FOR L1=1 TO 25
2440  N=N[L,L1]
2450  M=M[L,L1]
2460  IF M>5 THEN 2520
2470  IF M=N THEN 2540
2480  PRINT "^";
2490  B=B+1
2500  X[L,L1]=X[L,L1]+1
2510  GOTO 2550
2520  PRINT ".";
2530  GOTO 2550
2540  PRINT " ";
2550  IF L1-INT(L1/5)*5 THEN 2570
2560  PRINT " ";
2570  NEXT L1
2580  IF L<G1 THEN 2620
2590  IF E THEN 2620
2600  Q[K]=A-B
2610  PRINT TAB(45);Q[K];INT(Q[K]*100/A+.5);
2620  PRINT 
2630  NEXT L
2640  NEXT K
2650  REM     ===== STATISTICAL ANALYSIS =====
2660  REM  (SORT BY SCORE)
2670  FOR I=1 TO P-1
2680  K=I
2690  FOR J=I+1 TO P
2700  IF Q[K]>Q[J] THEN 2720
2710  K=J
2720  NEXT J
2730  T=Q[K]
2740  Q[K]=Q[I]
2750  Q[I]=T
2760  T=P[K]
2770  P[K]=P[I]
2780  P[I]=T
2790  NEXT I
2800  REM  (MEAN)
2810  X=0
2820  FOR I=1 TO P
2830  IF Q[I]<0 THEN 2850
2840  X=X+Q[I]
2850  NEXT I
2860  X=X/P
2870  REM  (STANDARD DEVIATION)
2880  Y=0
2890  FOR I=1 TO P
2900  IF Q[I]<0 THEN 2920
2910  Y=Y+(X-Q[I])^2
2920  NEXT I
2930  Y=SQR(Y/P)
2940  REM  (MEDIAN)
2950  Z=INT(P/2)+1
2960  PRINT LIN(-5)
2970  PRINT "     HIGH ="Q[1]
2980  PRINT "   MEDIAN ="Q[Z]
2990  PRINT "      LOW ="Q[P] MAX 0
3000  PRINT 
3010  PRINT "     MEAN ="X
3020  PRINT "STANDARD"
3030  PRINT "DEVIATION ="Y
3040  PRINT LIN(-5)"SORTED BY SCORE:"
3050  PRINT 
3060  GOSUB 3770
3070  PRINT LIN(-5)"SORTED BY STUDENT NUMBER:"
3080  PRINT 
3090  FOR I=1 TO P-1
3100  K=I
3110  FOR J=I+1 TO P
3120  IF P[K]<P[J] THEN 3140
3130  K=J
3140  NEXT J
3150  T=P[K]
3160  P[K]=P[I]
3170  P[I]=T
3180  T=Q[K]
3190  Q[K]=Q[I]
3200  Q[I]=T
3210  NEXT I
3220  GOSUB 3770
3230  REM  (ERROR ANALYSIS)
3240  PRINT LIN(5)"ERROR ANALYSIS:"
3250  PRINT 
3260  FOR I=1 TO G1
3270  PRINT " Q# WRONG   ";
3280  NEXT I
3290  PRINT 
3300  FOR I=1 TO G1
3310  PRINT " == =====   ";
3320  NEXT I
3330  PRINT 
3340  FOR I=1 TO 25
3350  FOR L=5 TO 1 STEP -1
3360  IF M[L,I]#0 THEN 3390
3370  NEXT L
3380  GOTO 3450
3390  FOR J=1 TO L
3400  IF M[J,I]>5 THEN 3430
3410  PRINT  USING "#,3D,5D,4X";J*25+I-25,X[J,I]
3420  GOTO 3440
3430  PRINT  USING "#,3D,9X";J*25+I-25
3440  NEXT J
3450  PRINT 
3460  NEXT I
3470  PRINT LIN(-2)"===== END "B$" ====="
3480  STOP 
3490  REM  ----- UNPACKS F(1-5) TO A(1-25) -----
3500  FOR I=1 TO 5
3510  X=F[I]
3520  FOR J=1 TO 5
3530  Y=INT(X*10^(J-5))
3540  A[I*5+J-5]=Y
3550  X=X-Y*10^(5-J)
3560  NEXT J
3570  NEXT I
3580  RETURN 
3590  REM  ----- CONVERTS A$ TO G -----
3600  F$="0123456789"
3610  G=0
3620  FOR I=K TO L
3630  IF A$[I,I]=" " THEN 3710
3640  FOR J=1 TO 10
3650  IF A$[I,I]=F$[J,J] THEN 3700
3660  NEXT J
3670  PRINT "."'7"."'7"."'7"ILLEGAL CHARACTER IN CC"I;
3680  E=1
3690  GOTO 3710
3700  G=G*10+J-1
3710  NEXT I
3720  RETURN 
3730  REM  ----- PRINTOUT SUBROUTINE -----
3740  IMAGE "  KEY",7D
3750  IMAGE 5D,7D,6D.D
3760  IMAGE 5D,"    ** INCOMPLETE **"
3770  PRINT "STUDENT RIGHT PERCENT"
3780  PRINT "======= ===== ======="
3790  PRINT  USING 3740;A
3800  FOR I=1 TO P
3810  IF Q[I]<0 THEN 3840
3820  PRINT  USING 3750;P[I],Q[I],INT(Q[I]*100/A+.5)
3830  GOTO 3850
3840  PRINT  USING 3760;P[I]
3850  NEXT I
3860  RETURN 
3870  END 
