1 ! 500.14 - STAT11 - EDIT00 EDIT MODULE RELEASED FOR SUBMISSION TO THE DECUS LIBRARY BY THE DEC ENGINEERING SYSTEMS GROUP AND THE EDUCATION PRODUCTS GROUP SEPTEMBER, 1977 2 ! COPYRIGHT (C) 1973, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASSACHUSETTS 3 ! THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. 4 ! THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. 5 ! DEC ASSUMES NO RESPONSIBILITY FOR USE OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. 6 ! THIS MODULE ADDS, DELETES, CHANGES, SAVES, AND PRINTS DATA IN THE VIRTUAL DATA MATRIX. 7 ! AUTHOR: MICHAEL D. KNAUER VERSION NUMBER: 001 DATE: OCTOBER, 1973 8 ! MODIFICATIONS: MAY, 1975 MODIFIED TO ACCEPT MISSING DATA POINTS BY ARDOTH HASSLER WILSON CENTRAL STATE UNIVERSITY EDMOND, OKLAHOMA 00009! MODIFICATIONS: JUNE, 1976 CTRL/C TRAP ADDED 10 ! CALLING ARGUMENTS 1) VARIABLE NAME: F9$ RANGE OF VALUES: S00000.RWM - S99999.RWM USE: NAME OF 250 ROW BY 15 COLUMN VIRTUAL DATA MATRIX. 11 ! 2) VARIABLE NAME: F2$ RANGE OF VALUES: ANY VALID BASIC-PLUS FILE NAME USE: NAME FOR OUTPUT FILE TO SAVE DATA 12 ! 3) VARIABLE NAME: C% RANGE OF VALUES: 1 - 15 USE: NUMBER OF COLUMNS IN DATA MATRIX 13 ! 4) VARIABLE NAME: R% RANGE OF VALUES: 1 - 250 USE: NUMBER OF ROWS IN DATA MATRIX 15 ! RETURNING ARGUMENTS THE LIST OF RETURNING ARGUMENTS IS THE SAME AS THE LIST OF CALLING ARGUMENTS. 20 ! DESCRIPTION OF FUNCTION IN THIS MODULE, THE USER DIRECTS THE ADDING, DELETING, CHANGING, SAVING, AND PRINTING OF DATA IN THE VIRTUAL DATA MATRIX. 21 ! THE USER DIRECTS WORK BY TYPING IN OPTION NUMBERS. CONTROL IS THEN TRANSFERRED TO VARIOUS ROUTINES, WHERE THE USER MUST USUALLY ENTER MORE INFORMATION SUCH AS ROW OR COLUMN NUMBERS OR NEW DATA. 22 ! IF ANYTHING IN THE DATA MATRIX IS CHANGED (WHICH IS USUALLY THE CASE) WHILE EDIT00 IS EXECUTING, THEN WHEN EDITING IS FINISHED CONTROL IS TRANSFERRED TO ESCRWM FOR RECOMPUTATION OF THE ELEMENTARY STATISTICS. 23 ! IF NOTHING IN THE DATA MATRIX IS CHANGED BY EDIT00, THEN CONTROL IS PASSED DIRECTLY TO THE NEXT ANALYSIS TO BE PERFORMED (OR BACK TO STATCM) WHEN EDITING IS FINISHED. 25 ! 39 ! NORMAL ENTRY TO THIS MODULE BEGINS BY SETTING THE SWITCH X% TO 0. IF CHANGES ARE MADE TO THE DATA MATRIX, X% IS SET TO 1, WHICH CAUSES CONTROL TO GO TO ESCRWM WHEN EDITING IS FINISHED. 40 X%=0% : GOTO 50 44 ! EDIT00 IS ENTERED HERE FROM THE ESCRWM ERROR ROUTINE. X% IS SET TO 1 TO FORCE A RETURN TO ESCRWM TO SEE IF THE USER DELETED OR CHANGED THE DATA IN ERROR. 45 X%=1% 49 ! HERE THE CALLING ARGUMENTS ARE RETRIEVED AND THE DATA FILE OPENED. 50 ON ERROR GOTO 900: GOSUB 10000: F$=SYS(CHR$(7%)) : R%=VAL(MID(F$,46%,5%)): C%=VAL(MID(F$,51%,5%)) : F9$=MID(F$,31%,15%) 55 A9$=MID(F$,62%,9%): A9$=LEFT(A9$,INSTR(5%,A9$,"]")): H9=.9E-38 60 DIM B(15%) 70 OPEN F9$ AS FILE 1 80 DIM #1,A(250%,15%) 94 ! HERE THE USER IS ASKED TO ENTER AN EDIT CODE. IF HE TYPES HELP, A LIST OF THE EDIT OPTIONS IS PRINTED. 95 PRINT 97 PRINT "TYPE HELP FOR A LIST OF EDIT CODES" 100 INPUT "TYPE EDIT CODE. (0 FOR NO MORE EDIT)";C9$ 105 PRINT 110 IF C9$="HELP" GOTO 1000 115 ON ERROR GOTO 125 120 C9%=VAL(C9$) 121 IF C9%>=0 AND C9%<=9% THEN GOTO 128 122 PRINT "EDIT CODE MUST BE BETWEEN 0 AND 9" 123 PRINT "PLEASE TRY AGAIN" 124 GOTO 97 125 IF ERR=28% THEN GOSUB 10000: X%=1%: RESUME 95 126 PRINT "INVALID EDIT CODE. PLEASE TRY AGAIN" : RESUME 95 127 ! FROM HERE, CONTROL IS PASSED TO THE APPROPRIATE EDIT OPTION ROUTINE. 128 ON ERROR GOTO 975 130 IF C9%=0% GOTO 2000 140 ON C9% GOTO 150,200,250,300,350,400,600,810,850 149 ! THIS ROUTINE CHANGES A SINGLE VALUE IN THE DATA MATRIX. NOTE THAT THE X% SWITCH IS SET TO 1. 150 INPUT "TYPE ROW AND COLUMN ";R1%,C1% 152 IF R1%>=1% AND R1%<=R% AND C1%>=1% AND C1%<=C% THEN GOTO 160 154 PRINT "THE ROW NUMBER MUST BE BETWEEN 1 AND"; R% 156 PRINT "THE COLUMN NUMBER MUST BE BETWEEN 1 AND"; C% 157 PRINT "PLEASE TRY AGAIN" 158 GOTO 150 160 INPUT "NEW VALUE";L$: IF L$=" " OR L$="X" THEN IF A(R1%,C1%)=H9 GOTO 170 ELSE A(R1%,C1%)=H9: A(0%,C1%)=A(0%,C1%)-1: GOTO 165 162 A(R1%,C1%)=VAL(L$) 163 A(0%,C1%)=A(0%,C1%)+1 165 X%=1% 167 PRINT 170 GOTO 100 199 ! THIS ROUTINE ASKS THE USER WHAT ROW HE WANTS TO REPLACE. 200 INPUT "WHICH ROW DO YOU WANT TO REPLACE ";N1% 202 IF N1%>=1% AND N1%<=R% GOTO 260 204 PRINT "THE ROW NUMBER MUST BE BETWEEN 1 AND"; R% 206 PRINT "PLEASE TRY AGAIN" 208 GOTO 200 249 ! THIS ROUTINE TELLS THE USER THE NUMBER OF THE NEW ROW IN THE DATA MATRIX ("ADD A ROW" OPTION). 250 PRINT "NUMBER OF NEW ROW IS ";R%+1% 251 IF R%+1%>=251% THEN PRINT "YOU CANNOT ADD A ROW": PRINT "YOUR DATA MATRIX ALREADY CONTAINS": PRINT "THE MAXIMUM 250 ROWS OF DATA": GOTO 100 256 R%=R%+1%: N1%=R% 259 ! THIS ROUTINE IS USED BY BOTH OF THE ABOVE ROW ROUTINES. THE USER ENTERS NEW VALUES FROM THE KEYBOARD TO REPLACE OR ADD A ROW TO THE MATRIX. 260 PRINT "TYPE";C%;" NUMBERS, ANY AMOUNT PER LINE": PRINT "SEPARATE NUMBERS WITH A COMMA BUT DO NOT END A LINE WITH A COMMA" 261 PRINT "IF A VALUE IS MISSING, TYPE AN 'X' WHERE THE VALUE"; " WOULD NORMALLY OCCUR" 262 INPUT LINE L$: L$=LEFT(L$,LEN(L$)-2)+"," 264 FOR K%=1% TO C% 265 Z%=INSTR(1%,L$,","): IF Z%=0% GOTO 275 266 IF LEFT(L$,Z%-1%)="" OR LEFT(L$,Z%-1%)="X" THEN A(N1%,K%)=H9 ELSE A(N1%,K%)=VAL(LEFT(L$,Z%-1%)): A(0%,K%)=A(0%,K%)+1 270 L$=RIGHT(L$,Z%+1%): GOTO 290 275 PRINT "TYPE IN MORE VALUES" 278 INPUT LINE L$: L$=LEFT(L$,LEN(L$)-2%)+",": GOTO 265 290 NEXT K%: X%=1%: PRINT "THE DATA HAS BEEN ADDED TO YOUR MATRIX IN ROW";N1%: GOTO 100 299 ! THIS ROUTINE ASKS THE USER WHAT ROW HE WANTS TO DELETE AND THEN SHIFTS ALL ROWS AFTER THAT ROW UP ONE ROW IN THE MATRIX. 300 INPUT "WHAT ROW NUMBER IS TO BE DELETED";N1% 301 IF R%<>1% GOTO 305 302 PRINT "YOU CANNOT DELETE A ROW. . ." 303 PRINT "YOU ONLY HAVE ONE ROW LEFT" 304 GOTO 100 305 IF N1%>=1% AND N1%<=R% GOTO 310 306 PRINT "THE ROW NUMBER MUST BE BETWEEN 1 AND"; R% 307 PRINT "PLEASE TRY AGAIN" 308 GOTO 300 310 D%=N1% 320 FOR I%=D%+1% TO R% 325 FOR J%=1% TO C%: IF A(I%-1%,J%)<>H9 THEN A(0%,J%)=A(0%,J%)-1 327 A(I%-1%,J%)=A(I%,J%): NEXT J% 330 NEXT I% 335 R%=R%-1% 340 PRINT "NEW MATRIX HAS ";R%;" ROWS AND ";C%;" COLUMNS." 342 X%=1% 344 PRINT 345 GOTO 100 349 ! THIS ROUTINE SETS THE PARAMETERS FOR PRINTING THE WHOLE MATRIX. 350 C8%=1% : C9%=C% 365 R1%=1% : R2%=R% 370 C1%=1% : C2%=C% 375 GOTO 420 399 ! THIS ROUTINE HAS THE USER TYPE IN PARAMETERS NECESSARY FOR PRINTING A SUBMATRIX. 400 INPUT "TYPE BEGINNING ROW,END ROW ";R1%,R2% 402 IF R1%>=1% AND R2%>=1% AND R1%<=R% AND R2%<=R% GOTO 410 404 PRINT "THE ROW NUMBERS MUST BE BETWEEN 1 AND"; R% 406 PRINT "PLEASE TRY AGAIN" 408 GOTO 400 410 INPUT "TYPE BEGINNING COLUMN,END COLUMN ";C1%,C2% 411 IF C1%>=1 AND C2%>=1 AND C1%<=C% AND C2%<=C% GOTO 415 412 PRINT "COLUMN NUMBERS MUST BE BETWEEN 1 AND"; C% 413 PRINT "PLEASE TRY AGAIN" 414 GOTO 410 415 C9%=C2% : C8%=C1% 418 ! THIS ROUTINE IS USED BY THE ABOVE TWO PRINT ROUTINES TO ACTUALLY PRINT OUT ON THE KEYBOARD THE FULL MATRIX OR A SUBMATRIX. 419 ! LINES 420, 540, AND 550 CAUSE THE TABLE TO BE PRINTED IN TWO OR THREE PARTS IF THERE ARE MORE THAN 6 COLUMNS. 420 IF (C9%-C8%)>5% THEN C9%=C8%+5% 430 PRINT : PRINT "ROW";TAB(37%);"COLUMN" : PRINT 431 I%=10% 432 FOR K%=C8% TO C9% 433 PRINT TAB(I%);K%; 434 I%=I%+11% 435 NEXT K% 439 PRINT 440 FOR I%=R1% TO R2% 450 PRINT I%;TAB(5%); 470 FOR J%=C8% TO C9% 475 IF A(I%,J%)=H9 THEN PRINT SPACE$(11%);: GOTO 500 480 PRINT USING " #####.####",A(I%,J%); 500 NEXT J% 510 PRINT 520 NEXT I% 530 PRINT : PRINT 540 IF C2%=C9% GOTO 100 550 C8%=C9%+1% : C9%=C2% 560 GOTO 420 598 ! THIS ROUTINE STORES THE CURRENT DATA MATRIX IN THE USER'S SPECIFIED OUTPUT FILE. NOTE THAT IF HE HAD PREVIOUSLY SPECIFIED THE KEYBOARD ("*" = "KB:") AS THE OUTPUT FILE, HE IS ALLOWED TO SPECIFY A NEW OUTPUT FILE NAME. 600 F2$=MID(F$,16%,15%) 601 IF F2$="KB:" THEN PRINT "STAT11 CANNOT SAVE YOUR DATA ON THE KEYBOARD": S8%=1%: GOTO 935 605 ON ERROR GOTO 900 610 OPEN F2$ AS FILE 2 615 ON ERROR GOTO 994 650 DIM #2,C(250%,15%) 660 FOR J%=1% TO R% 670 FOR K%=1% TO C% 680 C(J%,K%)=A(J%,K%) 690 NEXT K% 700 NEXT J% 702 C(0%,0%)=R% 704 C(1%,0%)=C% 710 CLOSE 2 720 PRINT "OUTPUT FILE ";F2$;" CREATED AS A VIRTUAL MATRIX WITH " 725 PRINT "DIMENSION OF";R%;" BY";C%:PRINT 730 GOTO 100 750 FOR J%=1% TO R% 760 FOR K%=1% TO C% 770 PRINT #2,A(J%,K%) 775 NEXT K% 780 NEXT J% 790 PRINT #2,CHR$(26) 795 CLOSE 2 800 GOTO 100 809 ! THIS ROUTINE ASKS THE USER WHICH COLUMN HE WANTS TO DELETE AND THEN SHIFTS ALL THE FOLLOWING COLUMNS OVER ONE TO CLOSE UP THE GAP. 810 INPUT "WHICH COLUMN DO YOU WANT TO DELETE "; N1% 811 IF C%<>1% GOTO 815 812 PRINT "YOU CANNOT DELETE A COLUMN. . ." 813 PRINT "YOU ONLY HAVE ONE COLUMN LEFT" 814 GOTO 100 815 IF N1%>=1% AND N1%<=C% GOTO 820 816 PRINT "COLUMN NUMBER MUST BE BETWEEN 1 AND"; C% 817 PRINT "PLEASE TRY AGAIN" 818 GOTO 810 820 FOR K%=1% TO R% 830 A(K%,J%)=A(K%,J%+1%) FOR J%=N1% TO C%-1% 835 NEXT K% 840 C%=C%-1% 844 X%=1% 846 PRINT 848 GOTO 100 849 ! HERE THE USER TYPES IN DATA POINTS AND THEY ARE ADDED TO THE MATRIX IN THE FORM OF A NEW COLUMN. 850 C1%=C%+1%: IF C1%>15% GOTO 890 851 PRINT "TYPE";R%;" NUMBERS ANY AMOUNT PER LINE": PRINT "SEPERATE NUMBERS WITH A COMMA, BUT DO NOT END A LINE"; "WITH A COMMA": PRINT "IF YOU HAVE A VALUE MISSING, TYPE AN 'X' WHERE IT WOULD"; " NORMALLY OCCUR" 852 A(0%,C1%)=0% 854 INPUT LINE L$ 856 L$=LEFT(L$,LEN(L$)-2)+"," 858 FOR K%=1% TO R% 860 Z%=INSTR(1%,L$,",") 862 IF Z%=0 GOTO 870 864 IF LEFT(L$,Z%-1%)="" OR LEFT(L$,Z%-1%)="X" THEN A(K%,C1%)=H9 ELSE A(K%,C1%)=VAL(LEFT(L$,Z%-1%)): A(0%,C1%)=A(0%,C1%)+1 866 L$=RIGHT(L$,Z%+1%) 868 GOTO 876 870 PRINT "TYPE IN MORE VALUES" 871 INPUT LINE L$ 872 L$=LEFT(L$,LEN(L$)-2%)+"," 874 GOTO 860 876 NEXT K% 877 IF A(0%,C1%)=0 THEN PRINT "ALL OF THE POINTS THAT YOU TYPED"; "WERE BLANK": PRINT "NO COLUMN IS ADDED": GOTO 100 878 PRINT "THE NEW DATA HAS BEEN ADDED TO YOUR MATRIX IN COLUMN";C1% 880 C%=C%+1% 881 X%=1% 882 GOTO 100 890 PRINT "YOU CANNOT ADD ANOTHER VARIABLE" 894 PRINT "YOUR DATA MATRIX ALREADY CONTAINS" 896 PRINT "THE MAXIMUM 15 COLUMNS OF DATA" 898 GOTO 100 899 ! THESE ARE VARIOUS ERROR ROUTINES REFERENCED BY THE ABOVE ROUTINES TO HANDLE NON-NUMERIC INPUT FROM THE KEYBOARD AND MISSING FILE NAMES. 900 IF ERR=28% THEN GOSUB 10000: X%=1%: RESUME 95 905 PRINT "STAT11 IS UNABLE TO OPEN "; F2$; " AS AN OUTPUT FILE" 910 PRINT "DO YOU WISH TO TRY AGAIN" 911 INPUT "TO SAVE DATA IN AN OUTPUT FILE"; W$ 915 IF W$="NO" OR LEFT(W$,1%)="N" OR W$="" GOTO 970 918 IF W$="YES" OR LEFT(W$,1%)="Y" GOTO 935 920 PRINT "YOU MUST TYPE EITHER YES OR NO" 930 GOTO 910 935 INPUT "PLEASE TYPE IN A NEW OUTPUT FILE NAME";F2$:PRINT 940 L$=LEFT(F$,15%) : R$=RIGHT(F$,31%) 950 F$=L$+LEFT(F2$+SPACE$(15%),15%)+R$ 955 IF S8%=1% THEN S8%=0%: GOTO 605 960 RESUME 610 970 RESUME 100 975 IF ERR=28% THEN GOSUB 10000: X%=1%: RESUME 95 977 PRINT "PLEASE TYPE ONLY NUMBERS WHEN NUMBERS ARE ASKED FOR " 980 PRINT "WHEN TWO OR MORE NUMBERS ARE REQUESTED, SEPARATE" 985 PRINT "THEM WITH COMMAS": PRINT 987 IF ERL=162 THEN RESUME 160 989 IF C9%=2% OR C9%=3% OR C9%=9% THEN PRINT "THE FIRST";K%;" VALUES HAVE BEEN SUCCESSFULLY PUT INTO YOUR MATRIX" 990 IF C9%=2% OR C9%=3% THEN RESUME 275 ELSE IF C9%=9% THEN RESUME 870 ELSE RESUME 140 994 IF ERR=28% THEN GOSUB 10000: X%=1%: RESUME 95% 996 ON ERROR GOTO 0 999 ! THIS IS THE HELP ROUTINE THAT PRINTS A LIST OF THE EDIT OPTIONS WHEN THE USER TYPES HELP INSTEAD OF AN EDIT OPTION NUMBER. 1000 PRINT : PRINT "THE FOLLOWING CODES SIGNIFY THE EDIT OPTIONS " 1020 PRINT " 1 - REPLACE AN INDIVIDUAL VALUE " 1030 PRINT " 2 - REPLACE AN ENTIRE ROW " 1040 PRINT " 3 - ADD A ROW " 1050 PRINT " 4 - DELETE A ROW " 1060 PRINT " 5 - PRINT ENTIRE MATRIX " 1070 PRINT " 6 - PRINT SUBMATRIX " 1080 PRINT " 7 - SAVE DATA " 1085 PRINT " 8 - DELETE A COLUMN" 1087 PRINT " 9 - ADD A COLUMN" 1090 PRINT " 0 - NO MORE EDIT " 1100 GOTO 100 1999 ! HERE, AFTER CLOSING THE DATA FILE, A$ IS CHECKED TO SEE IF THE NEXT ANALYSIS IS TO BE EDIT. IF SO, THEN STATCM IS SUBSTITUTED SINCE EDIT00 IS JUST NOW BEING EXECUTED AND THERE IS NO NEED TO EXECUTE IT AGAIN IMMEDIATELY. 2000 A(1%,0%)=C%: CLOSE 1 2005 A$=MID(F$,56%,20%) 2008 IF LEFT(A$,6%)="EDIT00" THEN A$="STATCM"+A9$+" " 2009 ! HERE THE RETURNING ARGUMENTS ARE STORED IF F$, WHICH WILL BE LOADED INTO COMMON. 2010 F$=LEFT(F$,45%) 2020 R$="00000"+RIGHT(NUM$(R%),2%) 2030 C$="00000"+RIGHT(NUM$(C%),2%) 2040 F$=F$+MID(R$,LEN(R$)-5%,5%) 2050 F$=F$+MID(C$,LEN(C$)-5%,5%) 2052 ! HERE CONTROL IS TRANSFERRED TO ESCRWM IF X% INDICATES THAT THE ELEMENTARY STATISTICS NEED TO BE RECOMPUTED. OTHERWISE, CONTROL IS TRANSFERRED TO THE MODULE NAMED BY A$. 2053 IF X%=0% GOTO 2070 2055 F$=F$+A$ 2060 R$=SYS(CHR$(8)+F$) 2067 CHAIN "ESCRWM"+A9$ 2070 F$=LEFT(F$,55%)+"STATCM"+A9$+" " 2075 R$=SYS(CHR$(8)+F$) 2080 CHAIN A$ 10000 V0$=SYS(CHR$(6%)+CHR$(-7%)): RETURN ! CTRL/C TRAP 32750 END