CCL Home Page
Up Directory CCL linplt.p
PROGRAM LinPltTest (OUTPUT);

{  Test PROCEDURE LinPlt.  }

CONST
   NCols = 51;
   NPts = 50;
   Scale = 10.0;        {  Scale factor for test plot  }

TYPE
   YArrTyp = ARRAY[1..512] OF REAL;

VAR
   Y : YArrTyp;
   J,KFlag : INTEGER;


PROCEDURE LinPlt (VAR Y:YArrTyp; NPts,NCols:INTEGER;
                  VAR KFlag:INTEGER);

{  LinPlt       Standard Pascal       January 1995
 
   PROCEDURE LinPlt prints a line plot on the line printer.
   Plots Y[J] versus J, one point per line.
 
   J. P. Chandler, Computer Science Department,
       Oklahoma State University                     

   Input quantities ....  Y[*], NPts, NCols
 
   Output quantity .....  KFlag


      Y[*]   --  The ordinates Y[1], Y[2], ..., Y[Npts] to be plotted

      NPts   --  The number of Y[J] values

      NCols  --  The number of columns (print positions) in the graph
                 (Suggestion...  Use NCols = 21 or 51 or 101)

      KFlag  --  A flag that returns a condition code as follows...
                 =  0 if LinPlt executed normally,
                 = -1 if Npts<1,
                 = -2 if NCols<3 or NCols>NCMax        (see below)
                 = -3 if DY=0.0                        (see below)
                 = -4 if JYZero<1 or JYZero>NCols      (see below)
}

CONST
   NCMax = 101;       {  Maximum number of print positions       }
   KBlank = ' ';
   KMinus = '-';      {  Symbol used for the Y axis              }
   KhPlus = '+';      {  Symbol used for the ends of the Y axis  }
   KhI = 'I';         {  Symbol used for the X axis              }
   KhZero = '0';      {  Symbol used at Y=0                      }
   KhSym = '*';       {  The plotting symbol                     }
   
TYPE
   LineType = PACKED ARRAY[1..101] OF CHAR;

VAR
   KhAxis,
   KhLine : LineType;
   J,K,JYZero,L,NCmu : INTEGER;
   YMin,YMax,DY : REAL;

BEGIN
   IF NPts < 1 THEN
      KFlag := -1
   ELSE IF (NCols < 3) OR (NCols > NCMax) THEN
      KFlag := -2
   ELSE
   BEGIN
      YMin := Y[1];
      YMax := Y[1];
      FOR J := 1 TO NPts DO
      BEGIN
         IF Y[J] < YMin THEN
            YMin := Y[J];
         IF Y[J] > YMax THEN
            YMax := Y[J];
      END;
 
      IF YMin > 0.0 THEN YMin := 0.0;
      IF YMax < 0.0 THEN YMax := 0.0;

      IF YMin >= YMax THEN
      BEGIN
         YMin := -1.0;
         YMax := +1.0;
      END;

{  At this point, either  YMin <= 0.0 <  YMax  or
                          YMin <  0.0 <= YMax    .
 
   Therefore, KFlag=-3 or KFlag=-4 should be impossible.  }

      NCmu := NCols - 1;
      DY := (YMax - YMin)/NCmu;
      IF DY = 0.0 THEN KFlag := -3
      ELSE
      BEGIN
         JYZero := Trunc(-YMin/DY + 1.5);
         IF (JYZero < 1) OR (JYZero > NCols) THEN
            KFlag := -4
         ELSE
         BEGIN
            Writeln;
            Writeln('    J   Y[J]         YMin = ',YMin:15,
                    '       YMax =',YMax:15);
            Writeln(' ---- -----------');

{  Print the Y axis.  }

            FOR J := 2 TO NCmu DO
               KhAxis[J] := KMinus;
            KhAxis[1] := KhPlus;
            KhAxis[NCols] := KhPlus;
            KhAxis[JYZero] := KhZero;

            Write(' ':18);
            FOR J := 1 TO NCols DO
               Write(KhAxis[J]);
            Writeln;

{  Loop over the lines in the graph.  }

            FOR J := 1 TO NPts DO
            BEGIN

{  Set up the line of characters and then print it.  }

               FOR K := 1 TO NCols DO
                  KhLine[K] := KBlank;

               KhLine[JYZero] := KhI;
               K := Trunc((Y[J] - YMin) / DY + 1.5);
               IF (K >= 1) AND (K <= NCols) THEN
                  KhLine[K] := KhSym;
  
               Write(J:5,' ',Y[J]:11,' ');
               FOR K := 1 TO NCols DO
                  Write(KhLine[K]);
               Writeln;
            END;          {  End loop over the points in the graph  }

{  Print another Y axis at the bottom of the graph.  }

            Write(' ':18);
            FOR J := 1 TO NCols DO
               Write(KhAxis[J]);
            Writeln;
            Writeln(' ':21,'YMin = ',YMin:15,
               '       YMax =',YMax:15);

            KFlag := 0;

         END;   {  End ELSE  (KFlag <> -4)                    }
      END;      {  End ELSE  (KFlag <> -3)                    }
   END;         {  End ELSE  (KFlag <> -1) and (KFlag <> -2)  }
END;            {  End PROCEDURE LinPlt                       }

BEGIN   {  Begin main  }

   FOR J := 1 TO NPts DO
      Y[J] := Sin(J/Scale) + 0.5;

   LinPlt(Y,NPts,NCols,KFlag);

END.    {  End main  }
Modified: Fri Mar 24 17:00:00 1995 GMT
Page accessed 7311 times since Sat Apr 17 21:35:13 1999 GMT