home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 1 / HamRadio.cdr / tech / ee3 / uplot.bas (.txt) < prev    next >
Encoding:
GW-BASIC  |  1989-01-22  |  9.7 KB  |  208 lines

  1. 10  CLS: PRINT "GENERALIZED PLOTTING PROGRAM V2.2.3I 3/6/87"
  2. 20  PRINT
  3. 30  PRINT "      *********************************************
  4. 40  PRINT "      *                                           *
  5. 50  PRINT "      *  BY DR. ALLEN KATZ, CHAIRMAN              *
  6. 60  PRINT "      *  DEPT ELECTRONICS ENGINEERING TECHNOLOGY  *
  7. 70  PRINT "      *  TRENTON STATE COLLEGE, CN4700            *
  8. 80  PRINT "      *  TRENTON, NEW JERSEY 08650-4700            *
  9. 90  PRINT "      *                                           *
  10. 100  PRINT "      *  THE AUTHOR RESERVES RIGHTS TO THIS       *
  11. 110  PRINT "      *  PROGRAM; HOWEVER, COPYING AND USE FOR    *
  12. 120  PRINT "      *  EDUCATIONAL PURPOSES IS ENCOURAGED.      *
  13. 130  PRINT "      *                                           *
  14. 140  PRINT "      *  PLEASE REPORT ANY ERRORS OR PROBLEMS     *
  15. 150  PRINT "      *  WITH THIS PROGRAM TO THE AUTHOR.         *
  16. 160  PRINT "      *  TEL (609) 771 2487                       *
  17. 170  PRINT "      *                                           *
  18. 180  PRINT "      *********************************************
  19. 190  PRINT: INPUT "WANT EXPLANATION (Y/N)"; Q$: IF Q$<>"Y" THEN 380
  20. 200  CLS: PRINT "UPLOT IS AN EASY TO USE PLOTTING PROGRAM DESIGNED TO WORK WITH MX80 LIKE
  21. 210  PRINT "PRINTERS. NO SPECIAL GRAPHICS ARE USED. GENERALLY IT IS DESIRABLE TO CUT
  22. 220  PRINT "OUT THE RESULTANT GRAPH AND ROTATE IT 90 DEGS FOR THE BEST PRESENTATION.
  23. 230  PRINT "THE INDEPENDANT VARIABLE IS PRINTED AT THE LEFT SIDE OF THE SHEET AND
  24. 240  PRINT "CAN BE OF ANY LENGTH. THE DEPENDANT VARIABLES ARE PLOTTED ACROSS THE
  25. 250  PRINT "SHEET AND CAN BE EITHER IN 'NARROW' MODE (80 CHARATERS) OR 'WIDE'
  26. 260  PRINT "MODE (124 CHARACTERS). THE NARROW MODE IS THE DEFAULT MODE. ALL SCALING
  27. 270  PRINT "IS HANDLED AUTOMATICALLY BY UPLOT. UPTO TWO VARIBLES MAY BE PLOTTED
  28. 280  PRINT "SIMULTANEOUSLY.": PRINT
  29. 290  PRINT "TO USE UPLOT ENTER NUMBER OF DEPENDANT VARIABLES, GRAPH TITLES, UNITS,
  30. 300  PRINT "MAXIMUM AND MINIMUM VALUES AND STEP SIZE OF THE INDEPENDANT VARIABLE.
  31. 310  PRINT "UPLOT WILL THEN PROVIDE PROMPTS FOR ENTERING THE DEPENDANT VARIABLE
  32. 320  PRINT "VALUES. WHEN TWO VALUES ARE REQUESED THEY SHOULD BE ENTERED ON THE
  33. 330  PRINT "SAME LINE SEPARATED BY A COMMA. ONCE ALL VALUES ARE ENTERED, UPLOT
  34. 340  PRINT "WILL ALLOW INCORRECT ENTERIES TO BE CHANGED. IT WILL THEN ASK FOR THE
  35. 350  PRINT "NUMBER OF SPACES TO BE PRINTED BETWEEN EACH VALUE OF THE DEPENDANT
  36. 360  PRINT "VARIABLE. TRY '0' TO START WITH. THE ENTERED DATA WILL THEN BE LISTED
  37. 361  PRINT "IN TABULAR FORM AND AN OPPORTUNITY TO CHANGE VALUES OF THE DEPENDANT
  38. 362  PRINT "VARIABLE WILL AGAIN BE PROVIDED BEFORE ACTUAL PLOTTING.": PRINT
  39. 363  PRINT "UPLOT ALSO ALLOWS GRAPHICAL DATA TO BE SAVED TO DISK FOR FUTURE USE
  40. 364  PRINT "AND MODIFICATION.
  41. 370  REM INITIALIZE PRINTER **********************************
  42. 380  LPRINT CHR$(27) CHR$(71): LL=80: PW=80: XX=LL: DIM X(15),Y1(15),Y2(15)
  43. 390  PRINT: INPUT "DO YOU WISH TO CHANGE PRINTER WIDTH OPTION (Y/N)"; Q$
  44. 400  IF Q$<>"Y" THEN 430 ELSE INPUT "PRINTER IS NARROW (80). DO YOU WANT IT WIDE (124) (Y/N)"; Q$
  45. 410  IF Q$="Y" THEN PW=120: LPRINT CHR$(15): WIDTH LPRINT 120
  46. 420  REM ************ FILE READ ****************************
  47. 430  PRINT: INPUT "WANT TO READ A FILE (Y/N/END)";Q$: DV=0
  48. 450  IF Q$="END" THEN END
  49. 460  IF Q$<>"Y" THEN 550
  50. 470  PRINT: INPUT "FILE NAME, FILES OR QUIT"; F$: N$=F$
  51. 480  IF F$="FILES"THEN FILES"*.PLT":GOTO 470 ELSE IF F$="QUIT"THEN 430
  52. 490  F$=F$+".PLT": OPEN "I",#1,F$
  53. 500  INPUT#1,NP,LP,SP,Q,G$,X$,Y$,Y1$,Y2$
  54. 510  ERASE X,Y1,Y2: DIM X(NP),Y1(NP),Y2(NP)
  55. 520  FOR I=0 TO NP: INPUT#1,X(I),Y1(I),Y2(I): NEXT
  56. 530  CLOSE#1: GOTO 830
  57. 540  REM ************ DATA INPUT **********************
  58. 550  PRINT: INPUT "ONE OR TWO VARIABLE PLOT (1/2)"; Q
  59. 560  IF Q>2 OR Q<1 THEN 550
  60. 570  PRINT: INPUT "GRAPH TITLE"; G$
  61. 580  INPUT "NAME INDEPENDENT VARIABLE"; X$
  62. 590  INPUT "UNITS OR TITLE OF DEPENDENT VARIABLE(S)"; Y$
  63. 600  IF Q=1 THEN Y1$=Y$: GOTO 630
  64. 610  INPUT "NAME OF 1ST DEPENDENT VARIABLE"; Y1$
  65. 620  INPUT "NAME OF 2ND DEPENDANT VARIABLE"; Y2$
  66. 630  PRINT: PRINT "MINIMUM VALUE OF "; X$;: INPUT LP
  67. 640  PRINT "MAXIMUM VALUE OF "; X$;: INPUT HP
  68. 650  PRINT X$; " STEP (MUST BE INTEGRAL FACTOR OF NP)";: INPUT SP: NP=(HP-LP)/SP
  69. 660  IF NP<>INT(NP) THEN PRINT: PRINT "INPUT ERROR": GOTO 630
  70. 670  ERASE X,Y1,Y2: DIM X(NP),Y1(NP),Y2(NP)
  71. 680  PRINT: FOR I=0 TO NP: X(I)=LP+I*SP
  72. 690  PRINT X$ " = " X(I) "  ";:IF Q=2 THEN PRINT Y1$ ", " Y2$;:INPUT Y1(I),Y2(I): GOTO 705
  73. 700  PRINT Y1$;: INPUT Y1(I): Y2(I)=Y1(I)
  74. 705  NEXT
  75. 710  PRINT: INPUT "WANT TO CHANGE VALUE (Y/N)";Q$: IF Q$<>"Y" THEN 770
  76. 720  PRINT X$ " VALUE =";: INPUT XC: IC=(XC-LP)/SP
  77. 730  IF IC<>INT(IC) THEN PRINT "VALUE ERROR": GOTO 720
  78. 740  PRINT X$ " = " X(IC) "  ";:IF Q=2 THEN PRINT Y1$ ", " Y2$ " ("Y1(IC) " , " Y2(IC)")";:INPUT Y1(IC),Y2(IC): GOTO 710
  79. 750  PRINT Y1$ " ("Y1(IC)")";: INPUT Y1(IC): Y2(IC)=Y1(IC): GOTO 710
  80. 760  REM *************** FILE SAVE *************************
  81. 770  PRINT: INPUT "WANT TO SAVE FILE (Y/N)"; Q$
  82. 780  IF Q$<>"Y" THEN 830
  83. 790  PRINT: INPUT "FILE NAME"; F$: N$=F$: F$=F$+".PLT"
  84. 800  OPEN "O",#1,F$
  85. 810  PRINT#1,NP;LP;SP;Q;G$;",";X$;",";Y$;",";Y1$;",";Y2$
  86. 820  FOR I=0 TO NP: PRINT#1,X(I);Y1(I);Y2(I): NEXT: CLOSE#1
  87. 825  REM ********************* TABULATE ***********************
  88. 830  IF DV=0 THEN PRINT:PRINT G$
  89. 832  IF DV=2 THEN LPRINT:LPRINT G$
  90. 840  IF DV=0 THEN PRINT: IF Q=1 THEN PRINT X$ TAB(16) Y1$ ELSE PRINT  X$ TAB(16) Y1$ TAB(32) Y2$
  91. 842  IF DV=2 THEN LPRINT: IF Q=1 THEN LPRINT X$ TAB(16) Y1$ ELSE LPRINT  X$ TAB(16) Y1$ TAB(32) Y2$
  92. 850  CN=0: FOR I=0 TO NP: IF DV=2 GOTO 862
  93. 860  IF Q=1 THEN PRINT X(I) TAB(16) Y1(I) ELSE PRINT X(I) TAB(16) Y1(I) TAB(32) Y2(I)
  94. 861  GOTO 870
  95. 862  IF Q=1 THEN LPRINT X(I) TAB(16) Y1(I) ELSE LPRINT X(I) TAB(16) Y1(I) TAB(32) Y2(I)
  96. 870  IF DV=0 AND CN<>0 AND CN/12=INT(CN/12) THEN INPUT"PRESS <CR> TO CONTINUE"; A$
  97. 880  CN=CN+1: NEXT
  98. 890  IF DV=2 THEN DV=0: GOTO 940
  99. 900  PRINT: INPUT "WANT TO CHANGE VALUE (Y/N)"; Q$: IF Q$="Y" THEN 720
  100. 910  PRINT: INPUT "WANT HARDCOPY (Y/N)"; H$
  101. 920  IF H$="END" THEN END
  102. 930  IF H$="Y" THEN DV=2: GOTO 830
  103. 940  PRINT: INPUT "WANT TO PLOT (Y/N/END)"; P$: IF P$="END" THEN END
  104. 950  IF P$<>"Y" THEN 430
  105. 960  REM **************** PLOT ROUTEENS *****************
  106. 970  PRINT: INPUT "# OF SPACES BETWEEN POINTS"; SS: SI=SS
  107. 980  PRINT: PRINT G$
  108. 990  IF Q=2 THEN PRINT "+ - " Y1$ "   * - " Y2$
  109. 1000  PRINT: LF=LL-18: SN=0: SH=0: BN=0: BH=0: FOR I=0 TO NP
  110. 1010  IF Y1(I)>BH THEN BH=Y1(I)
  111. 1020  IF Y1(I)<BN THEN BN=Y1(I)
  112. 1030  IF Y2(I)>SH THEN SH=Y2(I)
  113. 1040  IF Y2(I)<SN THEN SN=Y2(I)
  114. 1042  NEXT
  115. 1050  IF BN<SN THEN SN=BN
  116. 1060  IF BH>SH THEN SH=BH
  117. 1070  SF=SH-SN: ZV=INT(-LF*SN/SF+11)
  118. 1080  PRINT  X$ TAB(LF/2+7) Y$
  119. 1090  I1=INT(LF/2): I2=INT(LF*SH/(2*SF)): I3=INT(-LF*SN/(2*SF)): IQ=INT(LF/4): IH=INT(3*LF/4)
  120. 1100  IF SH=0 THEN PRINT TAB(11) SN TAB(IQ+11) 3*SN/4 TAB(I1+11) SN/2 TAB(IH+11) SN/4 TAB(LF+11) SH: GOTO 1150
  121. 1110  IF SN=0 THEN PRINT TAB(11) SN TAB(IQ+11) SH/4 TAB(I1+11) SH/2 TAB(IH+11) 3*SH/4 TAB(LF+11) SH: GOTO 1150
  122. 1120  IF ZV<(LF/4+11) THEN PRINT TAB(11) SN TAB(ZV) "0" TAB(ZV+I2) SH/2 TAB(LF+11) SH: GOTO 1150
  123. 1130  IF ZV>(3*LF/4+11) THEN PRINT TAB(11) SN TAB(I3+11) SN/2 TAB(ZV) "0" TAB(LF+11) SH: GOTO 1150
  124. 1140  PRINT TAB(11) SN TAB(I3+11) SN/2 TAB(ZV) "0" TAB(ZV+I2) SH/2 TAB(LF+11) SH: GOTO 1150
  125. 1150  PRINT  STRING$(10,45) "+";
  126. 1160  IF SN=0 OR SH=0 THEN PRINT  STRING$(IQ-1,45) "+" STRING$(I1-IQ-1,45) "+" STRING$(IH-I1-1,45) "+" STRING$(LF-IH-1,45) "+": GOTO 1200
  127. 1170  IF ZV<(LF/4+11) THEN PRINT  STRING$(ZV-12,45) "+" STRING$(I2-1,45) "+" STRING$(LF-ZV-I2+10,45) "+": GOTO 1200
  128. 1180  IF ZV>(3*LF/4+11) THEN PRINT  STRING$(I3-1,45) "+" STRING$(ZV-I3-12,45) "+" STRING$(LF-ZV+10,45) "+": GOTO 1200
  129. 1190  PRINT  STRING$(I3-1,45) "+" STRING$(ZV-I3-12,45) "+" STRING$(I2-1,45) "+" STRING$(LF-ZV-I2+10,45) "+"
  130. 1200  CN=0: FOR I=0 TO NP:VN=INT(LF*(Y2(I)-SN)/SF+11)
  131. 1210  TN=INT(LF*(Y1(I)-SN)/SF+11): PRINT  X(I);
  132. 1220  IF VN>11 AND TN>11 THEN PRINT TAB(11)"|";
  133. 1230  IF TN<VN THEN 1310
  134. 1240  IF TN=VN THEN 1370
  135. 1250  IF VN>ZV AND ZV>11 THEN PRINT TAB(ZV)"."TAB(VN)"*"TAB(TN)"+": GOTO 1410
  136. 1260  IF VN>ZV THEN PRINT TAB(VN)"*"TAB(TN)"+": GOTO 1410
  137. 1270  IF VN=ZV THEN PRINT TAB(VN)"*"TAB(TN)"+": GOTO 1410
  138. 1280  IF VN<ZV AND TN>ZV THEN PRINT TAB(VN)"*"TAB(ZV)"."TAB(TN)"+": GOTO 1410
  139. 1290  IF VN<ZV AND TN=ZV THEN PRINT TAB(VN)"*"TAB(TN)"+":GOTO 1410
  140. 1300  PRINT TAB(VN)"*"TAB(TN)"+"TAB(ZV)".": GOTO 1410
  141. 1310  IF TN>ZV AND ZV>11 THEN PRINT TAB(ZV)"."TAB(TN)"+"TAB(VN)"*": GOTO 1410
  142. 1320  IF TN>ZV THEN PRINT TAB(TN)"+"TAB(VN)"*": GOTO 1410
  143. 1330  IF TN=ZV THEN PRINT TAB(TN)"+"TAB(VN)"*": GOTO 1410
  144. 1340  IF TN<ZV AND VN>ZV THEN PRINT TAB(TN)"+"TAB(ZV)"."TAB(VN)"*": GOTO 1410
  145. 1350  IF TN<ZV AND VN=ZV THEN PRINT TAB(TN)"+"TAB(VN)"*":GOTO 1410
  146. 1360  PRINT TAB(TN)"+"TAB(VN)"*"TAB(ZV)".": GOTO 1410
  147. 1370  IF VN>ZV AND ZV>11 THEN PRINT TAB(ZV)"."TAB(VN)"*": GOTO 1410
  148. 1380  IF VN>ZV THEN PRINT TAB(VN)"*": GOTO 1410
  149. 1390  IF VN=ZV THEN PRINT TAB(VN)"*": GOTO 1410
  150. 1400  IF VN<ZV THEN PRINT TAB(VN)"*"TAB(ZV)"."
  151. 1410  IF DV=0 AND CN<>0 AND CN/12=INT(CN/12) THEN INPUT"PRESS <CR> TO CONTINUE"; A$
  152. 1420  CN=CN+1: IF SI=0 THEN SI=SS ELSE SI=SI-1: PRINT  TAB(11)"|" TAB(ZV)".": GOTO 1410
  153. 1430  NEXT I: IF DV=0 THEN PRINT: INPUT "WANT HARD COPY (Y/N)"; Q$: IF Q$="Y" THEN DV=2: LL=PW: GOSUB 1600
  154. 1440  PRINT: INPUT "WANT ANOTHER PLOT (Y/N/END)"; P$
  155. 1450  IF P$="END" THEN END ELSE IF P$<>"Y" THEN 430
  156. 1460  DV=0: LL=XX
  157. 1470  PRINT: INPUT "DO YOU WISH TO CHANGE PRINTER WIDTH OPTION (Y/N)"; Q$
  158. 1480  IF Q$<>"Y" THEN 970 ELSE INPUT "NARROW (80) OR WIDE (124) (N/W)"; Q$
  159. 1490  IF Q$="N" THEN PW=80 ELSE IF Q$="W" THEN PW=120 ELSE PRINT: GOTO 1470
  160. 1500  LPRINT CHR$(15): WIDTH LPRINT PW: GOTO 970
  161. 1600  REM **************** HARD COPY PLOT ROUTEENS *************
  162. 1620  LPRINT: LPRINT G$
  163. 1630  IF Q=2 THEN LPRINT "+ - " Y1$ "   * - " Y2$
  164. 1640  LPRINT: LF=LL-18: SN=0: SH=0: BN=0: BH=0: FOR I=0 TO NP
  165. 1650  IF Y1(I)>BH THEN BH=Y1(I)
  166. 1660  IF Y1(I)<BN THEN BN=Y1(I)
  167. 1670  IF Y2(I)>SH THEN SH=Y2(I)
  168. 1680  IF Y2(I)<SN THEN SN=Y2(I)
  169. 1682  NEXT
  170. 1690  IF BN<SN THEN SN=BN
  171. 1700  IF BH>SH THEN SH=BH
  172. 1710  SF=SH-SN: ZV=INT(-LF*SN/SF+11)
  173. 1720  LPRINT  X$ TAB(LF/2+7) Y$
  174. 1730  I1=INT(LF/2): I2=INT(LF*SH/(2*SF)): I3=INT(-LF*SN/(2*SF)): IQ=INT(LF/4): IH=INT(3*LF/4)
  175. 1740  IF SH=0 THEN LPRINT TAB(11) SN TAB(IQ+11) 3*SN/4 TAB(I1+11) SN/2 TAB(IH+11) SN/4 TAB(LF+11) SH: GOTO 1790
  176. 1750  IF SN=0 THEN LPRINT TAB(11) SN TAB(IQ+11) SH/4 TAB(I1+11) SH/2 TAB(IH+11) 3*SH/4 TAB(LF+11) SH: GOTO 1790
  177. 1760  IF ZV<(LF/4+11) THEN LPRINT TAB(11) SN TAB(ZV) "0" TAB(ZV+I2) SH/2 TAB(LF+11) SH: GOTO 1790
  178. 1770  IF ZV>(3*LF/4+11) THEN LPRINT TAB(11) SN TAB(I3+11) SN/2 TAB(ZV) "0" TAB(LF+11) SH: GOTO 1790
  179. 1780  LPRINT TAB(11) SN TAB(I3+11) SN/2 TAB(ZV) "0" TAB(ZV+I2) SH/2 TAB(LF+11) SH: GOTO 1790
  180. 1790  LPRINT  STRING$(10,45) "+";
  181. 1800  IF SN=0 OR SH=0 THEN LPRINT  STRING$(IQ-1,45) "+" STRING$(I1-IQ-1,45) "+" STRING$(IH-I1-1,45) "+" STRING$(LF-IH-1,45) "+": GOTO 1840
  182. 1810  IF ZV<(LF/4+11) THEN LPRINT  STRING$(ZV-12,45) "+" STRING$(I2-1,45) "+" STRING$(LF-ZV-I2+10,45) "+": GOTO 1840
  183. 1820  IF ZV>(3*LF/4+11) THEN LPRINT  STRING$(I3-1,45) "+" STRING$(ZV-I3-12,45) "+" STRING$(LF-ZV+10,45) "+": GOTO 1840
  184. 1830  LPRINT  STRING$(I3-1,45) "+" STRING$(ZV-I3-12,45) "+" STRING$(I2-1,45) "+" STRING$(LF-ZV-I2+10,45) "+"
  185. 1840  CN=0: FOR I=0 TO NP:VN=INT(LF*(Y2(I)-SN)/SF+11)
  186. 1850  TN=INT(LF*(Y1(I)-SN)/SF+11): LPRINT  X(I);
  187. 1860  IF VN>11 AND TN>11 THEN LPRINT TAB(11)"|";
  188. 1870  IF TN<VN THEN 1950
  189. 1880  IF TN=VN THEN 2010
  190. 1890  IF VN>ZV AND ZV>11 THEN LPRINT TAB(ZV)"."TAB(VN)"*"TAB(TN)"+": GOTO 2050
  191. 1900  IF VN>ZV THEN LPRINT TAB(VN)"*"TAB(TN)"+": GOTO 2050
  192. 1910  IF VN=ZV THEN LPRINT TAB(VN)"*"TAB(TN)"+": GOTO 2050
  193. 1920  IF VN<ZV AND TN>ZV THEN LPRINT TAB(VN)"*"TAB(ZV)"."TAB(TN)"+": GOTO 2050
  194. 1930  IF VN<ZV AND TN=ZV THEN LPRINT TAB(VN)"*"TAB(TN)"+":GOTO 2050
  195. 1940  LPRINT TAB(VN)"*"TAB(TN)"+"TAB(ZV)".": GOTO 2050
  196. 1950  IF TN>ZV AND ZV>11 THEN LPRINT TAB(ZV)"."TAB(TN)"+"TAB(VN)"*": GOTO 2050
  197. 1960  IF TN>ZV THEN LPRINT TAB(TN)"+"TAB(VN)"*": GOTO 2050
  198. 1970  IF TN=ZV THEN LPRINT TAB(TN)"+"TAB(VN)"*": GOTO 2050
  199. 1980  IF TN<ZV AND VN>ZV THEN LPRINT TAB(TN)"+"TAB(ZV)"."TAB(VN)"*": GOTO 2050
  200. 1990  IF TN<ZV AND VN=ZV THEN LPRINT TAB(TN)"+"TAB(VN)"*":GOTO 2050
  201. 2000  LPRINT TAB(TN)"+"TAB(VN)"*"TAB(ZV)".": GOTO 2050
  202. 2010  IF VN>ZV AND ZV>11 THEN LPRINT TAB(ZV)"."TAB(VN)"*": GOTO 2050
  203. 2020  IF VN>ZV THEN LPRINT TAB(VN)"*": GOTO 2050
  204. 2030  IF VN=ZV THEN LPRINT TAB(VN)"*": GOTO 2050
  205. 2040  IF VN<ZV THEN LPRINT TAB(VN)"*"TAB(ZV)"."
  206. 2050  IF SI=0 THEN SI=SS ELSE SI=SI-1: LPRINT  TAB(11)"|" TAB(ZV)".": GOTO 2050
  207. 2060  NEXT I: RETURN
  208.