1 ' TABULATION --- TABLE.BAS --- by Dr Russell Langley
2 GOTO 400
4 '<UNK! {000A}>--- Press Enter ---
5 IF PR THEN RETURN ELSE PRINT TAB(40);:PRINT "Press <Enter> to continue.";:IN$=INKEY$:WHILE INKEY$<>CHR$(13):WEND:LOCATE,40:PRINT SPACE$(26):RETURN
6 PRINT TAB(14);:PRINT "Press <Enter> to continue, or `/' to end viewing.";:IN$=INKEY$:WHILE IN$<>CHR$(13) AND IN$<>"/":IN$=INKEY$:WEND:LOCATE ,14:PRINT SPACE$(50):IF IN$="/" THEN I=N:PR=1:RETURN ELSE RETURN
7 '<UNK! {000A}>*** Redirect to Block ***
9 ON QB GOTO 400,177,500,30 '=start,printout,menu,quit.<UNK! {000A}>*** Finish up ***
10 CLOSE:IF HD$="" THEN LPRINT STRING$(79,61)STRING$(4,10)
11 GOTO 30
19 '<UNK! {000A}>--- Yes/No? ---
20 PRINT:PRINT"Do you want to "+DO$;
21 INPUT" (Y/N)";Z$:IF Z$="" THEN Z$="N":RETURN ELSE Z$=CHR$(ASC(Z$) AND 95):IF Z$="Y" OR Z$="N" THEN RETURN ELSE PRINT"WHAT? ";:GOTO 21
29 '<UNK! {000A}>--- Errors & End ---
30 IF ERR THEN BEEP ELSE RUN"MENU"
32 IF ERR=71 THEN INPUT"That drive is empty or its gate is open. Fix, then press <Enter>.";Z$:RESUME
39 ON ERROR GOTO 0:END'<UNK! {000A}><UNK! {000A}>*** Messages ***
46 ZZ$=STRING$(37-LEN(Z$)\2,177):LOCATE 1,1:PRINT ZZ$" ";:COLOR 15,0:PRINT Z$;:COLOR 7,0:PRINT" "ZZ$:RETURN 'Display brightened Z$ at top of screen
109 '<UNK! {000A}>*** Get Filespec ***
111 LINE INPUT "Filename (I will add .ASC extension)? ";FL$:IF FL$="" THEN 111 ELSE IF MID$(FL$,2,1)=":" THEN DR$=LEFT$(FL$,1):FL$=MID$(FL$,3)
112 ER=0:FOR I=1 TO LEN(FL$):Z$=MID$(FL$,I,1):IF INSTR(" .,/\|?*:;[]+="+CHR$(34),Z$) THEN ER=1
113 NEXT I
114 IF ER=0 AND FL$>"" AND LEN(FL$)<9 THEN FL$=FL$+".ASC" ELSE BEEP:PRINT "Invalid filename. Will you try again";:GOSUB 21:IF Z$="Y" THEN 111 ELSE 2
115 INPUT "Which drive (A,B,C,D)";DR$:IF DR$="" THEN 115
116 DR$=CHR$(ASC(DR$) AND 95):IF INSTR("ABCD",DR$)=0 THEN 115
117 INPUT "Which directory (e.g. WORK, MYDATA, or Null Entry if root) ";DR2$:IF DR2$="" THEN DR$=DR$+":" ELSE DR$=DR$+":\"+DR2$+"\"
129 '<UNK! {000A}>*** Open File if poss ***
134 ON ERROR GOTO 136:OPEN DR$+FL$ FOR INPUT AS #1
415 INPUT"Do you want Instructions, or to Merge a datafile (I or M)";Z$:IF Z$>"" THEN Z$=CHR$(ASC(Z$) AND 95):IF Z$="I" THEN RUN"TABDOC.BAS" ELSE IF Z$="M" THEN 418
416 GOTO 415
417 '<UNK! {000A}>--- Get filespec & Merge ---
418 QB=1:PRINT:GOSUB 111
419 PRINT:PRINT"Ok, merging...... When `Ok' appears, enter `RUN'.":MERGE DR$+FL$
420 '<UNK! {000A}>--- Restart with Datafile ---
421 DEFINT A-Z:MAX=20000
422 INPUT"Allow for how many persons";MP:INPUT"<UNK! {000A}>Allow for how many questions";MQ:IF MP*MQ>MAX THEN PRINT"Sorry, but that exceeds present capacity of"MAX"responses.":PRINT:GOTO 422
423 DIM I,J,K,M,N,Q,CK,NQ,ROW,COL,A(MP,MQ),F(10,10),ID$(MP),LAB$(MQ),NO(MQ),HD$(11)
424 S$=" ":EN$="END":LAB$="LABELS":F$=" ### ":TANS$="Tallying Answers of Person #":MM$=" Return to Main Menu.<UNK! {000A}>":ER$=CHR$(10)+"=====> ERROR."
425 FOR I=1 TO 9:HD$(I)=" ("+MID$(STR$(I),2)+") ":NEXT I:HD$(10)="NoAns":HD$(11)=" Sums"
426 PRINT"<UNK! {000A}>Choose type of tabulation:<UNK! {000A}>"TAB(12)"1 1-way frequency table.<UNK! {000A}>"TAB(12)"2 Both 1-way &/or 2-way tables."
427 INPUT "Which (1 or 2)";KIND:IF KIND<1 OR KIND>2 THEN 427
428 '<UNK! {000A}>--- Read Data ---
429 RESTORE:I=0:N=0
430 I=I+1:READ ID$(I):IF ID$(I)=EN$ THEN 439 ELSE IF ID$(I)=LAB$ THEN 440
431 LOCATE 16,1:PRINT"Reading Data of Person #"I:READ Z$:IF Z$="" THEN 441 ELSE Q=0:CK=0
432 FOR J=1 TO LEN(Z$):IF MID$(Z$,J,1)=S$ THEN 434 ELSE Q=Q+1:IF Q>MQ THEN 438 ELSE Q$=MID$(Z$,J,1):IF INSTR("0123456789",Q$)=0 THEN 437
433 A(I,Q)=VAL(Q$):IF I>1 THEN CK=CK+1
434 NEXT J:IF I=1 THEN NQ=Q ELSE IF CK<>NQ THEN 441
435 IF I<MP THEN 430 ELSE N=MP:READ Z$:IF Z$=EN$ THEN 439 ELSE IF Z$=LAB$ THEN 440 ELSE 442
436 '<UNK! {000A}>--- Checks & N ---
437 PRINT ER$:PRINT"Row"I"of datafile contains an invalid character.":GOTO 443
438 PRINT ER$:PRINT"Person #"I"has more than"MQ"questions!":GOTO 443
439 IF KIND=2 THEN PRINT ER$:PRINT"`LABELS' missing and needed for 2-way tables.":GOTO 443
440 N=-(N=0)*(I-1)-(N=MP)*MP:IF KIND=1 THEN 500 ELSE 445
441 PRINT ER$:PRINT"Number of answers from Person #"I"differs from Person #1.":GOTO 443
442 PRINT"Data statement with `END' or `LABELS' not found after"MP"persons."
443 PRINT"Please correct this by editing & re-saving your datafile!":END
444 '<UNK! {000A}>--- Read Labels ---
445 FOR J=1 TO NQ:LOCATE 18,1:PRINT"Reading Label #"J:READ LAB$(J):IF LAB$(J)=EN$ THEN 450 ELSE IF LAB$(J)="" THEN 448
446 READ NO(J):IF NO(J)>1 AND NO(J)<10 THEN NEXT J:READ Z$:IF Z$=EN$ THEN 500 ELSE 449
447 PRINT"Question"J"has "NO(J)" options. It MUST have 2 to 9 options.":GOTO 443
448 PRINT"Question"J"has NO LABEL!":GOTO 443
449 PRINT ER$:PRINT"Too many entries in LABEL list!":GOTO 443
450 PRINT ER$:PRINT"Not enough entries in LABEL list!":GOTO 443
499 '<UNK! {000A}>--- Menu ---
500 QB=3:PR=0:CLOSE:CLS:PRINT TAB(30)"M E N U<UNK! {000A}>"TAB(29)STRING$(9,45)"<UNK! {000A}>"
501 PRINT"<UNK! {000A}>"TAB(26)"1 Show Data<UNK! {000A}>"TAB(26)"2 Print Data<UNK! {000A}>"TAB(26)"3 Tally & Show 1-Way Table";
502 IF KIND=1 THEN PRINT"<UNK! {000A}>"TAB(26)"4"MM$:M=4 ELSE PRINT"<UNK! {000A}>"TAB(26)"4 Show Labels<UNK! {000A}>"TAB(26)"5 Print Labels<UNK! {000A}>"TAB(26)"6 Tally & Show 2-Way Tables<UNK! {000A}>"TAB(26)"7"MM$:M=7
503 PRINT TAB(19)"----> Which (1-"MID$(STR$(M),2)") ";:INPUT OP$:OP=VAL(OP$):IF OP<1 OR OP>M THEN BEEP:GOTO 503
504 ON OP GOTO 506,512,600:IF KIND=1 AND OP=4 THEN 10 ELSE ON OP-3 GOTO 610,614,700,10
505 '<UNK! {000A}>--- Show/Print Data ---
506 CLS:GOSUB 160:IF NQ<51 THEN SHO=20 ELSE SHO=10
507 PRINT #2,"Data read was:<UNK! {000A}> # ID Answers (in blocks of 5)"
508 FOR I=1 TO N:PRINT #2,USING"### \ \ ";I;ID$(I);
509 FOR J=1 TO NQ:PRINT #2,MID$(STR$(A(I,J)),2);:IF J MOD 5=0 THEN PRINT #2,S$;
510 NEXT J:PRINT #2,:IF PR=0 THEN IF I MOD SHO=0 THEN IF I<N THEN GOSUB 6
511 NEXT I:GOSUB 5:GOSUB 193:GOTO 500
512 PRINT:GOSUB 162:GOSUB 165:SHO=1:GOTO 507
599 '<UNK! {000A}>--- 1-Way Tables ---
600 CLS:ERASE F:DIM F(NQ,10):PRINT TANS$;:FOR I=1 TO N:LOCATE 1,29:PRINT I:FOR J=1 TO NQ:K=A(I,J):IF K=0 THEN K=10
601 F(J,K)=F(J,K)+1:NEXT J:NEXT I:CLS:GOSUB 160
602 PRINT #2,"1-WAY FREQUENCY TABLE & Row Percentages based on"N"Persons."