1  REM ****  HP BASIC PROGRAM LIBRARY  ******************************
2  REM
3  REM       GMARKS: GSB GRADING PROGRAM
4  REM
5  REM       36518 REV A, PART 1 OF 2
6  REM
7  REM ****  CONTRIBUTED PROGRAM  ***********************************
10  FILES GRADES
20  DIM W[20],R[300],P[20],G$[26]
30  DIM F[5],X[5],L$[2]
40  DIM H$[3],Y[5],T$[2],P$[40]
50  READ G$
60  H$="UPH"
70  MAT  READ X
80  MAT  READ Y
90  IF  END #1 THEN 1170
100  DATA "H P+P P-U "
110  DATA .75,.25,-.15,-.65,-1
120  DATA 1,.5,0,-.3,-1
130  READ #1,1
140  MAT F=ZER
150  PRINT "GSB GRADING PROGRAM. PLEASE ANSWER ALL QUESTIONS Y FOR"
160  PRINT "YES, N FOR NO.  ALWAYS USE A CARRIAGE RETURN AFTER "
170  PRINT "ENTERING DATA. USE ESC KEY FOR ERROR. DO YOU WANT INSTRUCTIONS?"
180  INPUT A$
190  IF A$="N" THEN 300
200  PRINT "THE PROGRAM ACCEPTS THE NUMBER OF GRADES FOR THE STUDENTS"
210  PRINT "AND WEIGHTS TO BE MULTIPLIED BY EACH GRADE.  THEN EACH"
220  PRINT "STUDENT NUMBER IS ENTERED IN ORDER FOLLOWED BY HIS GRADES"
230  PRINT "ON EACH ASSIGNMENT (EITHER NUMERICAL OR LETTER GRADES)."
240  PRINT "IF LETTER GRADES ARE USED, H IS A +1 AND U A -1. A STUDENT"
250  PRINT "NUMBER OF 999 ENDS THE INPUT. THE GRADES ARE SAVED"
260  PRINT "AND THE PROGRAM CAN READ THEM FROM A PRIOR ENTRY RUN."
270  PRINT "A DISTRIBUTION IS PRINTED AND GRADES MAY BE SCALED BY"
280  PRINT "ADDING A CONSTANT OR ENTERING NEW BREAKPOINTS."
290  PRINT 
300  PRINT "HOW MANY GRADES ARE THERE (20 MAX).?"
310  INPUT N
320  IF N <= 20 THEN 350
330  PRINT "MAXIMUM OF 20 GRADES PLEASE."
340  GOTO 300
350  PRINT "WHAT ARE THE RAW WEIGHTS FOR EACH GRADE?"
360  REM*****INPUT THE WEIGHTS FOR EACH GRADE
370  MAT  INPUT W[N]
380  C=0
390  FOR J=1 TO N
400  C=C+W[J]
410  NEXT J
420  REM*****CALCULATE  WEIGHTS
430  PRINT "NORMALIZED WEIGHTS ARE:"
440  FOR J=1 TO N
450  LET W[J]=W[J]/C
460  PRINT W[J];
470  NEXT J
480  PRINT 
490  I1=1
500  Q=0
510  PRINT "DO YOU WANT TO READ OLD GRADES FROM DISK?"
520  INPUT A$
530  IF A$="N" THEN 560
540  Q=1
550  READ #1,1
560  L1=0
570  IF Q THEN 620
580  PRINT "ARE YOU ENTERING LETTER GRADES?"
590  INPUT A$
600  IF A$="N" THEN 620
610  L1=1
620  P1=0
630  PRINT "DO YOU WANT TO SEE EACH GRADE?"
640  INPUT A$
650  IF A$="N" THEN 670
660  P1=1
670  IF Q THEN 760
680  PRINT "ENTER EACH STUDENT NO. FOLLOWED BY CR. NO=999 FOR LAST STUDENT."
690  PRINT "ENTER GRADES ON NEXT LINE SEPARATED BY COMMAS, FOLLOWED BY CR"
700  IF L1 THEN 730
710  PRINT "FOR MISSING GRADE, ENTER 9,GRADE IGNORED & WEIGHTS RECALCULATED"
720  GOTO 740
730  PRINT "FOR MISSING GRADE, ENTER Z,GRADE IGNORED & WEIGHTS RECALCULATED"
740  E=0
750  IF  NOT Q THEN 780
760  GOSUB 2230
770  GOTO 1000
780  INPUT S
790  IF S=999 THEN 1170
800  IF I1=S THEN 830
810  PRINT "ERROR IN STUDENT NUMBERS:";I1;S
820  GOTO 780
830  IF  NOT L1 THEN 940
840  REM*****LETTER GRADES ENTERED
850  E=0
860  INPUT P$
870  GOSUB 1720
875  E=E+1
880  GOTO E OF 960,890,910
890  PRINT "ERROR IN GRADES ";T$;" ON END OF ";P$[1,I];" REENTER STN";I1
900  GOTO 850
910  PRINT "NOT ENOUGH GRADES,REENTER STN";I1
920  GOTO 850
930  REM*****NUMBER GRADES
940  MAT  INPUT P[N]
950  REM*****WRITE GRADES ON DISK
960  FOR J=1 TO N
970  PRINT #1;P[J]
980  NEXT J
990  REM*****CALCULATE GRADES-FIGURE NEW WEIGHTS FOR MISSING GRADES
1000  FOR K=1 TO N
1010  IF P[K]<9 THEN 1040
1020  GOSUB 1590
1030  GOTO 1090
1040  NEXT K
1050  G=0
1060  FOR K=1 TO N
1070  G=G+W[K]*P[K]
1080  NEXT K
1090  G=G+.005
1110  R[I1]=G
1120  GOSUB 2130
1125  IF  NOT P1 THEN 1140
1130  PRINT "STN";I1;G;L$
1140  I1=I1+1
1150  GOTO 750
1160  REM*****PRINT FREQUENCY
1170  I1=I1-1
1175  PRINT #1; END 
1180  PRINT "GRADE           NO    %   CUM%   %LETTER"
1190  T=0
1200  V=0
1210  FOR J=1 TO 5
1220  U=INT(F[J]/I1*100+.5)
1230  T=T+U
1240  V=V+U
1250  K=J*2-1
1260  LET W=(J/3)-INT(J/3)
1270  IF J=2 OR J=3 THEN 1310
1280  PRINT G$[K,K+1],F[J];U;T;V
1290  V=0
1300  GOTO 1320
1310  PRINT G$[K,K+1],F[J];U;T
1320  NEXT J
1330  PRINT "IF YOU WANT TO SCALE GRADES, ENTER SCALING FACTOR.  FOR"
1340  PRINT "NEW BREAKPOINTS ENTER 9, TO STOP ENTER 99. SCALING BEGINS"
1350  PRINT "AT ORIGINAL GRADES EACH TIME."
1360  INPUT A
1370  IF A >= 99 THEN 2320
1380  IF A <> 9 THEN 1460
1390  PRINT "ENTER NEW BREAKPOINTS."
1400  FOR K=1 TO 5
1410  T=K*2-1
1420  PRINT G$[T,T+1]
1430  INPUT X[K]
1440  NEXT K
1450  A=0
1460  FOR K=1 TO 5
1470  F[K]=0
1480  NEXT K
1490  PRINT "DO YOU WANT TO SEE EACH GRADE?"
1500  INPUT A$
1510  FOR I=1 TO I1
1520  G=R[I]+A
1540  GOSUB 2130
1545  IF A$="N" THEN 1560
1550  PRINT "STN";I;G;L$
1560  NEXT I
1570  GOTO 1180
1580  REM*****SUBROUTINE TO CALCULATE NEW WEIGHTS
1590  Z=W[K]
1600  FOR J=K+1 TO N
1610  IF P[J]<9 THEN 1630
1620  Z=W[J]+Z
1630  NEXT J
1640  G=0
1650  Z=1-Z
1660  FOR K=1 TO N
1670  IF P[K] >= 9 THEN 1690
1680  G=G+W[K]/Z*P[K]
1690  NEXT K
1700  RETURN 
1710  REM*****SUBROUTINE TO CONVERT LETTER GRADES
1720  M=0
1730  I=-1
1740  L=LEN(P$)
1750  REM*****LOOK THRU INPUT FOR COMMAS
1760  FOR J=1 TO L
1770  IF J <> L THEN 1810
1780  K=I+2
1790  I=J
1800  GOTO 1850
1810  IF P$[J,J] <> "," THEN 2060
1820  K=I+2
1830  I=J-1
1840  REM*****LETTER GRADE LOCATED
1850  M=M+1
1860  T$=P$[K,I]
1870  T=LEN(T$)
1880  REM*****LOOK FOR GRADE OF ONE LETTER
1885  IF T <> 1 THEN 1990
1890  IF T$ <> "Z" THEN 1920
1900  P[M]=9
1910  GOTO 2060
1920  FOR T=1 TO 3
1930  IF T$ <> H$[T,T] THEN 1960
1940  P[M]=T-2
1950  GOTO 2060
1960  NEXT T
1970  GOTO 2100
1980  REM*****LOOK FOR GRADE OF TWO LETTERS
1990  IF T <> 2 THEN 2100
2000  FOR T=1 TO 10 STEP 2
2010  IF T$[1,2] <> G$[T,T+1] THEN 2040
2020  P[M]=Y[INT(T/2)+1]
2030  GOTO 2060
2040  NEXT T
2050  GOTO 2100
2060  NEXT J
2070  IF M=N THEN 2090
2080  E=2
2090  RETURN 
2100  E=1
2110  RETURN 
2120  REM*****SUBROUTINE TO CONVERT TO LETTER GRADES
2130  IF G >= X[5] THEN 2136
2132  L=1
2134  GOTO 2180
2136  FOR L=1 TO 5
2140  IF G>X[L] THEN 2180
2150  NEXT L
2160  PRINT "PROGRAM ERROR FINDING GRADES"
2170  STOP 
2180  T=L*2-1
2190  L$=G$[T,T+1]
2200  F[L]=F[L]+1
2210  RETURN 
2220  REM*****SUBROUTINE TO READ FROM DISK
2230  FOR J=1 TO N
2240  READ #1;P[J]
2250  NEXT J
2260  PRINT I1,
2270  FOR J=1 TO N
2280  PRINT P[J];
2290  NEXT J
2300  PRINT 
2310  RETURN 
2320  PRINT "BREAKPOINTS USED FOR GRADING:"
2330  FOR I=1 TO 5
2340  T=I*2-1
2350  PRINT G$[T,T+1];X[I]
2360  NEXT I
2370  GOTO 2380
2380  END 
