1000 ! SATCSB -- CALCULATES MEDIAN AND MEAN SAT SCORES ! FOR CURRENT STUDENTS FROM CSB FILE: BASED ON ! 'SORTX' PROGRAM. 1020 ! 04-DEC-73 J. WARDEN WABASH COLLEGE 1040 T3=TIME(0%) : PRINT"MEDIAN SAT SCORES V03S" 1060 DIM I$(63),O$(63),A$(63),P$(63),A2$(16) 1080 ON ERROR GO TO 2100 1100 I0$="VERBAL" 1120 INPUT"CLASS YEAR WANTED ( FOR ALL)";Y5$ 1140 M0,V0,M2,V2=0. 1160 IF LEN(Y5$)=0% THEN Y5%=0% ELSE IF LEN(Y5$)<>2% THEN PRINT"RETYPE PLEASE" : GO TO 1160 1180 IF LEN(Y5$)>0% THEN Y5%=VAL(Y5$)-73% 1200 READ H$(I%) FOR I%=0% TO 4% 1220 DATA "ALL STUDENTS","SENIORS",JUNIORS,SOPHOMORES,FRESHMEN 1240 L5$=H$(Y5%) 1260 INPUT "CSB FILE";F$ : R%=INSTR(1%,F$,":") : IF R% THEN D$=LEFT(F$,R%) 1280 IF INSTR(1%,D$,"DT") THEN PRINT : PRINT "** INPUT FILE MUST BE ON A DISK **" : GO TO 5120 1300 N%=2% ! TYPE 'CSB' => 2 R/B 1320 N6%=N%-1% : N1%=510%/N% : N3%=N%*N1% : N2%=N1%-8% 1340 OPEN F$ FOR INPUT AS FILE 5% 1360 FIELD #5%,N1%*R% AS Z$,N1% AS I$(R%) FOR R%=0% TO N6% 1380 C%=1% 1400 P1$= D$+"SORT1" : GOSUB 4300 1420 IF R%Y5$ THEN 1420 1480 V%=VAL(MID(I$(R%),76%,3%)) : M%=VAL(MID(I$(R%),79%,3%)) 1500 IF M%=0% OR V%=0% THEN 1420 1520 LSET P$(P%)=CVT%$(V%)+CVT%$(M%) 1540 M=M% : V=V% : M0=M0+M : V0=V0+V : M2=M2+M^2 : V2=V2+V^2 1560 GOSUB 4620 : C%=C%+1% : GO TO 1420 1580 C%=C%-1% 1600 LSET P$(P1%)="\\\\\\\\" FOR P1%=P% TO 62% 1620 PUT #1%,COUNT 504% 1640 CLOSE 1% 1660 PRINT"=======" : PRINT L5$+": "; 1680 ! INIT LINK FILE 1700 PRINT C%;"SCORES SELECTED" 1720 A1$= D$+"SORT1" : GOSUB 4240 1740 P1$= D$+"MERGE" : GOSUB 4300 1760 ! - - - - - - - - - - - - - - 1780 PRINT"-"; 1800 I%=C%/16% : I2%=I%*16% : I3%=C%-I2% 1820 FOR I1%=1% TO I% 1840 C2%=16%*(I1%-1%)+1% : C3%=C2%+15% 1860 GOSUB 4680 1880 NEXT I1% 1900 C2%=C3%+1% : C3%=C2%+I3%-1% 1920 GOSUB 4680 ! SORT TAG END 1940 LSET P$(P1%)="\\\\\\\\" FOR P1%=P% TO 62% 1960 PUT #1%,COUNT 504% 1980 CLOSE 1%,2% 2000 PRINT"-"; 2020 IF C%<=16% THEN 3480 ! SKIP MERGE IF 16 REC OR LESS 2040 ! - - - - - - - - - - - - - 2060 GO TO 2260 2080 ! ERRORS COME HERE... 2100 IF ERR=11% THEN RESUME 1580 2120 IF ERR<>5% THEN 2220 2140 PRINT"** CAN'T FIND FILE '"+F$+"' **" 2160 INPUT"FILE TO BE SORTED IS";F$ 2180 IF INSTR(1%,F$,"/") THEN F$=LEFT(F$,INSTR(1%,F$,"/")-1%) 2200 RESUME 1340 2220 ON ERROR GO TO 0 2240 GO TO 5120 2260 ! NOW WE MUST OPEN A MERGE FILE 2280 ON ERROR GO TO 0 2300 P1$= D$+"SORT1" : GOSUB 4300 2320 A1$= D$+"MERGE" : GOSUB 4200 2340 ! BEGIN MERGE SEQUENCE 2360 PRINT"-"; 2380 F%=16% 2400 ! RE-INITIALIZE MERGE SEQUENCES HERE 2420 S1%=1% : S2%=1%+F% ! STARTING PLACES 2440 PRINT"-"; 2460 ! SHORT MERGES CONTINUE HERE 2480 U1%=S1%+F%-1% : U2%=S2%+F%-1% ! UPPER LIMITS 2500 IF U1%>=C% THEN 3100 2520 IF U2%>C% THEN U2%=C% 2540 H%=S1% : GOSUB 4380 2560 H%=S2% : GOSUB 4460 2580 IF A$(A%)<=O$(O%) THEN 2700 2600 LSET P$(P%)=O$(O%) 2620 S2%=S2%+1% 2640 GOSUB 4620 2660 IF S2%>U2% THEN 2920 2680 GOSUB 4580 : GO TO 2580 2700 LSET P$(P%)=A$(A%) 2720 S1%=S1%+1% 2740 GOSUB 4620 2760 IF S1%>U1% THEN 2800 2780 GOSUB 4540 : GO TO 2580 2800 LSET P$(P%)=O$(O%) 2820 GOSUB 4620 2840 FOR I%=S2%+1% TO U2% 2860 GOSUB 4580 : LSET P$(P%)=O$(O%) : GOSUB 4620 2880 NEXT I% 2900 GO TO 3040 2920 LSET P$(P%)=A$(A%) 2940 GOSUB 4620 2960 FOR I%=S1%+1% TO U1% 2980 GOSUB 4540 : LSET P$(P%)=A$(A%) : GOSUB 4620 3000 NEXT I% 3020 ! FIRST SHORT MERGE COMPLETE 3040 S1%=U2%+1% : S2%=S1%+F% 3060 GO TO 2480 3080 ! WRITE UNMERGED ENTRIES 3100 H%=P9% : GOSUB 4380 3120 Q%=P9% 3140 FOR I%=Q% TO C% 3160 GOSUB 4540 : LSET P$(P%)=A$(A%) : GOSUB 4620 3180 NEXT I% 3200 LSET P$(P1%)="\\\\\\\\" FOR P1%=P% TO 62% 3220 PUT #1%,COUNT 504% 3240 ! COMPLETE PASS THROUGH FILE 3260 CLOSE 1%,2%,3% 3280 F%=F%*2% 3300 IF F%>=C% THEN 3460 3320 IF P1$= D$+"SORT1" THEN 3400 3340 P1$= D$+"SORT1" : GOSUB 4300 3360 A1$= D$+"MERGE" : GOSUB 4200 3380 GO TO 2420 3400 P1$= D$+"MERGE" : GOSUB 4300 3420 A1$= D$+"SORT1" : GOSUB 4200 3440 GO TO 2420 3460 ! WE'RE DONE!! 3480 PRINT : KILL A1$ 3500 ! NOW WRITE THE RESULTS 3520 OPEN P1$ FOR INPUT AS FILE 1% 3540 FIELD #1%,8%*A% AS Z$,8% AS A$(A%) FOR A%=0% TO 62% 3560 GET #1% : L0%=CVT$%(LEFT(A$(0%),2%)) 3580 N%=63% : N6%=62% : R1%=(C%+N6%)/N% : A%=C%-1%-(R1%-1%)*N% 3600 GET #1%,RECORD R1% : H0%=CVT$%(LEFT(A$(A%),2%)) 3620 C1%=C%-2%*(C%/2%) 3640 I2%=C%/2% : C0=C% 3660 R1%=(I2%+N6%)/N% : A%=I2%-1%-(R1%-1%)*N% 3680 GET #1%,RECORD R1% : M1%=CVT$%(LEFT(A$(A%),2%)) 3700 IF A%<62% THEN A%=A%+1% ELSE A%=0% : GET #1% 3720 M2%=CVT$%(LEFT(A$(A%),2%)) 3740 IF C1%THEN M%=M2% ELSE M%=(M1%+M2%)/2% 3760 CLOSE 1% : PRINT I0$+" "; 3780 PRINT"MEDIAN =";M% 3800 PRINT I0$+" MEAN ="; : PRINT USING "####",V0/C0 3820 PRINT I0$+" S.D. ="; : PRINT USING "####", SQR( V2/C0 - (V0/C0)^2 ) 3840 PRINT I0$+" RANGE="; : PRINT USING"#### TO####",L0%,H0% 3860 IF I0$<>"MATH" THEN I0$="MATH" : GO TO 3920 3880 PRINT"-------" 3900 PRINT USING "TIME ####.# MINUTES",(TIME(0%)-T3)/60 : GO TO 5120 3920 ! SWAP VERBAL, MATH SCORES 3940 V0=M0 : V2=M2 3960 A$=A1$ : A1$=P1$ : P1$=A$ 3980 GOSUB 4240 : GOSUB 4300 4000 FOR I%=1% TO C% 4020 GOSUB 4540 4040 LSET P$(P%)=MID(A$(A%),3%,2%)+LEFT(A$(A%),2%)+RIGHT(A$(A%),5%) 4060 GOSUB 4620 : NEXT I% 4080 LSET P$(P1%)="\\\\\\\\" FOR P1%=P% TO 62% 4100 PUT #1%,COUNT 504% 4120 KILL A1$ 4140 IF P1$<>D$+"SORT1" THEN NAME P1$ AS D$+"SORT1" 4160 GO TO 1720 4180 ! - - - I/O SUBROUTINES - - - 4200 OPEN A1$ FOR INPUT AS FILE 3% 4220 FIELD #3%,8%*O% AS Z$,8% AS O$(O%) FOR O%=0% TO 62% 4240 OPEN A1$ FOR INPUT AS FILE 2% 4260 FIELD #2%,8%*A% AS Z$,8% AS A$(A%) FOR A%=0% TO 62% 4280 RETURN 4300 OPEN P1$ FOR OUTPUT AS FILE 1% 4320 FIELD #1%,8%*P% AS Z$, 8% AS P$(P%) FOR P%=0% TO 62% 4340 P%,P9%=0% 4360 RETURN 4380 R1%=(H%+62%)/63% 4400 A%=H%+62%-R1%*63% 4420 GET #2%,RECORD R1% 4440 RETURN 4460 R2%=(H%+62%)/63% 4480 O%=H%+62%-R2%*63% 4500 GET #3%,RECORD R2% 4520 RETURN 4540 IF A%<62% THEN A%=A%+1% ELSE A%=0% : GET #2% 4560 RETURN 4580 IF O%<62% THEN O%=O%+1% ELSE O%=0% : GET #3% 4600 RETURN 4620 IF P%<62% THEN P%=P%+1% ELSE P%=0% : PUT #1%,COUNT 504% 4640 P9%=P9%+1% 4660 RETURN 4680 ! BUBBLE SORT SUBROUTINE 4700 FOR R%=C2% TO C3% 4720 S%=R%-C2% 4740 IF A%<62% THEN A%=A%+1% ELSE A%=0% : GET #2% 4760 A2$(S%)=A$(A%)+"" 4780 NEXT R% 4800 FOR R%=0% TO C3%-C2% 4820 T2%=0% 4840 FOR S%=1% TO C3%-C2% 4860 S1%=S%-1% 4880 IF A2$(S%)>=A2$(S1%) THEN 4940 4900 T$=A2$(S%) : A2$(S%)=A2$(S1%) : A2$(S1%)=T$ 4920 T2%=1% 4940 NEXT S% 4960 IF T2%=0% THEN 5000 4980 NEXT R% 5000 FOR R%=C2% TO C3% 5020 S%=R%-C2% 5040 LSET P$(P%)=A2$(S%) 5060 IF P%<62% THEN P%=P%+1% ELSE P%=0% : PUT #1%, COUNT 504% 5080 NEXT R% 5100 RETURN 5120 END