SUB PLOTER(S$(),N,NV) DIM PL$(60) COM (W) W(250,3) H9=.9E-38 ON ERROR GOTO <> AB$="PLEASE TYPE Y OR N" ! ! SORT VERTICAL AXIS VARIABLE IN DESCENDING ORDER CARRYING ! HORIZONTAL AXIS VARIABLES ALONG ! N1=N-1 <<*SOR>> L=0 FOR I=1 TO N1 X=W(I,0) \ Y=W(I+1,0) \ & IF X>Y GOTO <> L=1 \ W(I,0)=Y \ W(I+1,0)=X \ & FOR J=1 TO NV Q=W(I,J) \ W(I,J)=W(I+1,J) \ W(I+1,J)=Q NEXT J <<*NI1>> NEXT I IF L=1 THEN N1=N1-1 \ GOTO <> ! ! FIND RANGE OF DATA FOR PLOTS ! YMIN=W(N,0) \ YMAX=W(1,0) IF YMAX=YMIN THEN PRINT "THE VERTICAL AXIS DATA IS CONSTANT" \ & GOTO <> XMIN=1.E37 \ XMAX=-1.E37 FOR I=1 TO N FOR J=1 TO NV X=W(I,J) IF X=H9 GOTO <> IF XXMAX THEN XMAX=X <<*NJ1>> NEXT J NEXT I IF XMAX=XMIN THEN PRINT "THE HORIZONTAL AXIS DATA IS CONSTANT" \ & GOTO <> ! <<*HAB>> INPUT "DO YOU WISH TO SPECIFY AXIS BOUNDARIES (Y/N)";K$ \ & PRINT \ K$=LEFT(K$,1) IF K$="N" GOTO <> IF K$<>"Y" THEN PRINT AB$ \ GOTO <> PRINT "RANGE OF HORIZONTAL AXIS DATA IS";XMIN;" TO";XMAX \ PRINT ! <<*EHB>> PRINT "ENTER LOW AND HIGH BOUNDARIES OF HORIZONTAL AXIS"; INPUT "(FORM: XX.X,XX.X)";XMI1;XMA1 \ PRINT IF XMA1=XMI1 THEN PRINT "YOUR BOUNDARIES ARE THE SAME. PLEASE "+ & "TRY AGAIN" \ GOTO <> IF XMI1>XMA1 THEN Q=XMI1 \ XMI1=XMA1 \ XMA1=Q XINT=(XMA1-XMI1)/60. \ & XM1=XMA1+XINT/2. \ XL1=XMI1-XINT/2. \ & IF XL1<=XMIN AND XM1>=XMAX THEN GOTO <> IL=0 FOR I=1 TO N FOR J=1 TO NV X=W(I,J) IF X<>H9 THEN IF XXM1 THEN IL=IL+1 NEXT J NEXT I IF IL=0 GOTO <> ! <<*HBS>> PRINT IL;" POINT(S) ARE OFF THE PLOT WITH THESE BOUNDARIES. DO "+ & "YOU STILL" \ & INPUT "WISH TO USE THESE VALUES (Y/N)";L$ \ PRINT \ L$=LEFT(L$,1) IF L$="N" THEN GOTO <> IF L$<>"Y" THEN PRINT AB$ \ GOTO <> <<*HBD>> XMIN=XMI1 \ XMAX=XMA1 PRINT "RANGE OF VERTICAL AXIS DATA IS";YMIN;" TO";YMAX \ PRINT ! <<*EVB>> PRINT "ENTER LOW AND HIGH BOUNDARIES OF VERTICAL AXIS" \ & INPUT "(FORM: XX.X,XX.X)";YMI1;YMA1 \ PRINT IF YMA1=YMI1 THEN PRINT "YOUR BOUNDARIES ARE THE SAME. PLEASE "+ & "TRY AGAIN" \ GOTO <> IF YMI1>YMA1 THEN Q=YMI1 \ YMI1=YMA1 \ YMA1=Q YINT=(YMA1-YMI1)/20. \ & YM1=YMA1+YINT/2. \ YL1=YMI1-YINT/2. \ & IF YL1<=YMIN AND YM1>=YMAX GOTO <> IL=0 FOR I=1 TO N X=W(I,0) IF X<>H9 THEN IF XYM1 THEN IL=IL+1 NEXT I IF IL=0 GOTO <> ! <<*VBS>> PRINT IL;" POINT(S) ARE OFF THE PLOT WITH THESE BOUNDARIES. DO "+ & "YOU STILL" \ & INPUT "WISH TO USE THESE VALUES (Y/N)";L$ \ PRINT \ L$=LEFT(L$,1) IF L$="N" THEN GOTO <> IF L$<>"Y" THEN PRINT AB$ \ GOTO <> <<*VBD>> YMIN=YMI1 \ YMAX=YMA1 AMAX=YMAX \ AMIN=YMIN \ & GOSUB <> V$=H$+" " \ & AMAX=XMAX \ AMIN=XMIN \ & GOSUB <> GOTO <> <<*UAB>> AMAX=YMAX \ AMIN=YMIN \ N1=20 \ & GOSUB <> YMAX=PMAX \ YMIN=PMIN \ YINT=DIST \ V$=H$+" " \ & AMAX=XMAX \ AMIN=XMIN \ N1=30 \ & GOSUB <> XMAX=PMAX \ XMIN=PMIN \ XINT=DIST/2. ! ! PRINT SCATTER PLOT ! <<*PLT>> Y2=YINT/2. \ Y=YMAX-Y2 \ K=1 \ IL=(ND+1)/2 \ YM1=YMAX+Y2 FOR I=0 TO 20 PL$(J)=" " FOR J=1 TO 60 IF I=20 THEN PL$(J)="." FOR J=2 TO 58 STEP 2 \ & PL$(J)="+" FOR J=10 TO 60 STEP 10 IF I=(I/5)*5 THEN PRINT USING V$,Y+Y2; \ PL$(0)="+" ELSE & PRINT SPACE$(11); \ PL$(0)="." <<*LIN>> IF K>N GOTO <> X=W(K,0) IF X>YM1 GOTO <> IF X> FOR M=1 TO NV X=W(K,M) IF X=H9 GOTO <> L=(X-XMIN)/XINT+.5 \ & IF L<0 OR L>60 GOTO <> C$=PL$(L) IF C$="E" GOTO <> IF S$(M)="E" THEN PL$(L)="E" \ GOTO <> IF C$=" " OR C$="." OR C$="+" THEN PL$(L)=S$(M) \ GOTO<> IF C$="*" OR C$="A" OR C$="B" OR C$="C" OR C$="O" THEN & PL$(L)="2" \ GOTO <> IF C$>"1" AND C$<"9" THEN PL$(L)=CHR$(ASCII(C$)+1) <<*NXM>> NEXT M <<*NXK>> K=K+1 \ & IF K<=N GOTO <> <<*NXL>> PRINT PL$(J); FOR J=0 TO 60 \ PRINT \ & Y=Y-YINT NEXT I PRINT SPACE$(15-IL); \ & T=XMIN \ & FOR I=1 TO 5 T=T+10*XINT \ PRINT USING H$,T; NEXT I PRINT \ & PRINT " "; \ PRINT USING H$,XMIN; \ & PRINT TAB(62); \ PRINT USING H$,XMAX GOTO <> ! ! SUBROUTINE TO GET GOOD UNITS AND PRINT FORMAT ! <<*FOR>> PMIN=ABS(AMIN) PMAX=ABS(AMAX) IF PMIN=0. THEN NIB=0 ELSE NIB=LOG10(PMIN) \ IF PMIN>=1. THEN NIB=NIB+1 IF PMAX=0. THEN NIA=0 ELSE NIA=LOG10(PMAX) \ IF PMAX>=1. THEN NIA=NIA+1 NAL=NIA IF NIB>NIA THEN NAL=NIB IF NAL>3 THEN NFA=0 \ GOTO <> IF NAL<1 THEN NFA=-NAL+3 ELSE NFA=4-NAL <<*FFD>> IF NIA<=0 THEN NIA=1 IF AMAX<0. THEN NIA=NIA+1 IF NIB<=0 THEN NIB=1 IF AMIN<0. THEN NIB=NIB+1 IF NIB>NIA THEN NIA=NIB ND=NIA+NFA IF ND>8 THEN S$=" ##.##^^^^" \ ND=9 \ GOTO <> H$=" " IF ND<8 THEN H$=H$+" " FOR I=ND+1 TO 8 H$=H$+"#" FOR I=1 TO NIA H$=H$+"." IF NFA>0 THEN H$=H$+"#" FOR I=1 TO NFA <<*AD1>> RETURN ! ! SUBROUTINE TO GET PRINT FORMAT ! <<*SCL>> A=(AMAX-AMIN)/N1 \ & NAL=LOG10(A) \ & IF A<1. THEN NAL=NAL-1 B=A/10.**NAL \ & FOR I=1 TO 9 IF B> NEXT I I=10 <<*FND>> DIST=I*10.**NAL FM1=AMIN/DIST M1=FM1 IF FM1<0. THEN M1=M1-1 IF ABS(M1+1.-FM1)<.00002 THEN M1=M1+1 PMIN=DIST*M1 FM2=AMAX/DIST M2=FM2+1. IF FM2<-1. THEN M2=M2-1 IF ABS(FM2+1.-M2)<.00002 THEN M2=M2-1 PMAX=DIST*M2 NP=M2-M1 IF NP>N1 THEN I=I+1 \ GOTO <> NX=(N1-NP)/2 PMIN=PMIN-NX*DIST PMAX=PMIN+N1*DIST IF PMAXAMIN THEN PMIN=AMIN PMA1=ABS(PMAX) IF PMA1=0. THEN NIA=0 ELSE NIA=LOG10(PMA1) \ IF PMA1>=1. THEN NIA=NIA+1 IF NIA<=0 THEN NIA=1 IF PMAX<0. THEN NIA=NIA+1 PMI1=ABS(PMIN) IF PMI1=0. THEN NIB=0 ELSE NIB=LOG10(PMI1) \ IF PMI1>=1. THEN NIB=NIB+1 IF NIB<=0 THEN NIB=1 IF PMIN<0. THEN NIB=NIB+1 IF NIB>NIA THEN NIA=NIB IF NAL>=0 THEN NFA=0 ELSE IF I<10 THEN NFA=-NAL ELSE NFA=-1-NAL ND=NIA+NFA IF ND>8 THEN S$=" ##.##^^^^" \ ND=9 \ GOTO <> H$=" " IF ND<9 THEN H$=H$+" " FOR I=ND+1 TO 8 H$=H$+"#" FOR I=1 TO NIA H$=H$+"." IF NFA>0 THEN H$=H$+"#" FOR I=1 TO NFA <<*ADT>> RETURN ! ! ERROR RECOVERY SUBROUTINE ! <<*ERR>> IF ERL=<> OR ERL=<> THEN & PRINT "YOU TYPED CHARACTERS THAT CANNOT BE INTERPRETED. SEPARATE "+ & "TWO OR MORE" \ PRINT "NUMBERS WITH A COMMA, BUT DO NOT END A "+ & "LINE WITH A COMMA" \ PRINT "PLEASE TRY AGAIN" \ PRINT IF ERL=<> THEN RESUME <> IF ERL=<> THEN RESUME <> PRINT \ PRINT "CALCULATIONS CANNOT BE COMPLETED BECAUSE COMPUTATION"+ & " CREATED NUMBERS" \ PRINT "OUTSIDE THE RANGE OF THIS COMPUTER" \ & PRINT \I=ERR \ PRINT ERT$(I) \ & PRINT "PLOTER ERROR";ERR;" AT LINE";ERL \ PRINT \ & PRINT "PLEASE RECORD THE ABOVE LINE AND CONTACT JOHN PENN IN BR "+ & "AT 3886" \ PRINT RESUME <> <<*END>> SUBEND