home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 December / simtel1292_SIMTEL_1292_Walnut_Creek.iso / msdos / pcmag / vol4n13.arc / BAR3.BAS < prev    next >
BASIC Source File  |  1980-01-02  |  4KB  |  91 lines

  1. 'Figure 3:  (longest line = 64 characters; stat 67% in 2-column width)
  2.  
  3.   0 '** Double bar chart: Program 3 **
  4.  10 INF=1.7E+38      'Infinity
  5.  20 LM=50:RM=250:TM=30:BM=140  'Screen margins
  6.  30 IF BM>190 THEN CLS:PRINT"The bottom  margin is too large
  7.       for":PRINT"the titles to fit. Use a larger one.":END
  8.  40 IF TM<3 THEN CLS:PRINT"The top margin is too small
  9.       for":PRINT"the titles to fit. Use a larger one.":END
  10.  50 SCREEN 0:WIDTH 80:CLS       'Set graphics mode
  11.  60 INPUT"Number of values in vertical axis ";NV:IF NV<2 THEN 60
  12.  70 INPUT"Number of bars ";N:IF N<2 THEN 70
  13.  80 DIM S(N,2),T$(N)      'Set space for N values and titles
  14.  90 DIM M(200),N(200)   'Temporary arrays for GET and PUT
  15. 100 MAX=-INF           'Set maximum to minus infinity
  16. 110 MIN=INF            'Set minimum to infinity
  17. 120 FOR I=1 TO N
  18. 130   INPUT"Title ";T$(I)
  19. 140   FOR J=1 TO 2
  20. 150     PRINT J;
  21. 160     INPUT"Value ";S(I,J)
  22. 170     IF S(I,J)>MAX THEN MAX=S(I,J)
  23. 180     IF S(I,J)<MIN THEN MIN=S(I,J)
  24. 190   NEXT
  25. 200 NEXT
  26. 210 IF MAX=MIN THEN PRINT"All numbers are the same.":END
  27. 220 'Find longest value
  28. 230 LNG1=LEN(STR$(INT(MAX))):IF MAX>=0 THEN LNG1=LNG1-1
  29. 240 LNG2=LEN(STR$(INT(MIN))):IF MIN>=0 THEN LNG2=LNG2-1
  30. 250 IF LNG1>LNG2 THEN MAXLEN=LNG1 ELSE MAXLEN=LNG2  'Find
  31.       length of longest value
  32. 260 IF MAXLEN*8+2>LM THEN CLS:PRINT"The left margin is too small
  33.       for the":PRINT"values to  fit.  Use  a larger one.":END
  34. 270 'Draw chart
  35. 280 SCREEN 1:CLS
  36. 290 LINE(LM,TM)-(LM,BM)     'Y-axis
  37. 300 LINE(LM,BM)-(RM,BM)     'X-axis
  38. 310 WC=(RM-LM+1)/N          'Width of one column
  39. 320 WB=WC*.8                'Width of one bar
  40. 330 MWT=WB\8                'Maximum width of titles
  41. 340 SPB=LM+WC*.5-(WB*.5)    'Starting point of first bar
  42. 350 CC=SPB+WB\2             'Center of first column
  43. 360 HW=BM-TM+1              'Height of window
  44. 370 MVP=INT(HW*.95)         'Maximum vertical point
  45. 380 FACTOR=MVP/(MAX-MIN)    'Scaling factor for bars
  46. 390 D=MAX-MIN               'Distance between MIN and MAX
  47. 400 FV=1/(NV-1)             'Factor to scale values
  48. 410 DY=MVP/(NV-1)           'Vertical distance between values
  49. 420 PY=TM+MVP-3:PX=LM-2-MAXLEN*8  'Position of values
  50. 430 'Put values in vertical axis
  51. 440 FOR I=0 TO NV-1
  52. 450   T=INT(D*FV*I+MIN)     'Value for Y axis
  53. 460   LOCATE 1,1:PRINT USING STRING$(MAXLEN,"#");T;
  54. 470   GET(0,0)-(MAXLEN*8-1,7),M   'Copy value in graphics form
  55. 480   LOCATE 1,1:PRINT SPACE$(MAXLEN);
  56. 490   DH=PY+3
  57. 500   PUT(PX,PY),M,PSET
  58. 510   FOR J=LM TO RM STEP 3   'Dotted line
  59. 520     PSET(J,DH)
  60. 530   NEXT
  61. 540   PY=PY-DY   'Set vertical position for next value
  62. 550 NEXT
  63. 560 GET(0,0)-(200,7),N  'Copy top-left part of screen
  64. 570 'Put titles in horizontal axis
  65. 580 FOR I=1 TO N
  66. 590   LOCATE 1,1:T$=LEFT$(T$(I),MWT):PRINT T$;"  "
  67. 600   LT=LEN(T$)*8    'Length of title, in pixels
  68. 610   GET(0,0)-(LT,7),M  'Copy title in graphics form
  69. 620   PUT(CC-LT\2,BM+2),M     'Put title in its place
  70. 630   CC=CC+WC
  71. 640 NEXT
  72. 650 LOCATE 1,1:PRINT SPACE$(20);   'Erase last title
  73. 660 PUT(0,0),N,PSET                'Restore axis and value
  74. 670 FB=WB*.3   'Fraction of bar to make them thinner
  75. 680 'Draw bars
  76. 690 FOR I=1 TO N
  77. 700   FOR J=1 TO 2
  78. 710     HEIGHT=(S(I,J)-MIN)*FACTOR  'Height of bar
  79. 720     ON J GOTO 730,770
  80. 730       X1=SPB:Y1=MVP-HEIGHT+TM:X2=SPB+WB-FB:Y2=BM
  81. 740       LINE(X1,Y1)-(X2,Y2),1,BF
  82. 750       LINE(X1,Y1)-(X2,Y2),3,B
  83. 760       GOTO 810
  84. 770       X1=SPB+FB:Y1=MVP-HEIGHT+TM:X2=SPB+WB:Y2=BM
  85. 780       LINE(X1,Y1)-(X2,Y2),2,BF
  86. 790       LINE(X1,Y1)-(X2,Y2),3,B
  87. 800     SPB=SPB+WC    'Set position of next bar
  88. 810   NEXT
  89. 820 NEXT
  90. 830 W$=INPUT$(1)
  91.