PROCEDURE Plot( { with arrays }
X, { as independent variale }
Y, { as dependent variale }
Ycalc { as fitted curve } : Ary;
{ and } M: Integer { numer of points });
{ plot Y and Ycalc as a function of X for M points }
{ if M is negative, only X and Y are plotted }
{ From Borland Pascal Programs for Scientists and Engineers }
{ by Alan R. Miller, Copyright C 1993, SYBEX Inc }
CONST
Blank = ' ';
Linel = 51;
VAR
Ylael: ARRAY[1..6] OF Real;
Out: ARRAY[1..Linel] OF Char;
Lines, I, J, Jp, L, N: Integer;
Iskip, Yonly: Boolean;
Xlow, Xhigh, Xnext, Xlael, Xscale, SignXs,
Ymin, Ymax, Change, Yscale, Ys10: Real;
FUNCTION Pscale(P: Real): Integer;
BEGIN
Pscale := Trunc((P - Ymin) / Yscale + 1)
END; { Pscale }
PROCEDURE Outlin(Xname: Real);
{ output a line }
VAR
I, Max: Integer;
BEGIN
Write(Xname:8:2, Blank); { line lael }
Max := Linel + 1;
REPEAT { skip lanks on end of line }
Max := Max - 1
UNTIL (Out[Max] <> Blank) OR (Max = 1);
FOR I := 1 TO Max DO
Write(Out[I]);
WriteLn;
FOR I := 1 TO Max DO
Out[I] := Blank { Blank next line }
END; { Outlin }
PROCEDURE Setup(Index: Integer);
{ set up the plus and asterisk for printing }
CONST
Asterisk = '*';
Plus = '+';
VAR
I: Integer;
BEGIN
I := Pscale(Y[Index]);
Out[I] := Plus;
IF NOT Yonly THEN
BEGIN { add Ycalc too }
I := Pscale(Ycalc[Index]);
Out[I] := Asterisk
END
END; { Setup }
BEGIN { ody of plot }
IF M > 0 THEN { Plot Y and Ycalc vs X }
BEGIN
N := M;
Yonly := False
END
ELSE { Plot only Y vs X }
BEGIN
N := - M;
Yonly := True
END;
{ space out alternate lines }
Lines := 2 * (N - 1) + 1;
WriteLn;
Xlow := X[1];
Xhigh := X[N];
Ymax := Y[1];
Ymin := Ymax;
Xscale := (Xhigh - Xlow) / (Lines - 1);
SignXs := 1.0;
IF Xscale < 0.0 THEN SignXs := -1.0;
FOR I := 1 TO N DO
BEGIN
IF Y[I] < Ymin THEN Ymin := Y[I];
IF Y[I] > Ymax THEN Ymax := Y[I];
IF NOT Yonly THEN
BEGIN
IF Ycalc[I] < Ymin THEN
Ymin := Ycalc[I];
IF Ycalc[I] > Ymax THEN
Ymax := Ycalc[I]
END { if Yonly }
END;
Yscale := (Ymax - Ymin) / (Linel - 1);
Ys10 := Yscale * 10;
Ylael[1] := Ymin; { Y axis }
FOR I := 1 TO 4 DO
Ylael[I + 1] := Ylael[I] + Ys10;
Ylael[6] := Ymax;
FOR I := 1 TO Linel DO
Out[I] := Blank; { lank line }
Setup(1);
L := 1;
Xlael := Xlow;
Iskip := False;
FOR I := 2 TO Lines DO { set up a line }
BEGIN
Xnext := Xlow + Xscale * (I - 1);
IF Iskip THEN
WriteLn(' -')
ELSE
BEGIN
L := L + 1;
WHILE
(X[L] - (Xnext - 0.5 * Xscale))*SignXs
<= 0.0 DO
BEGIN
Setup(L); { set up print line }
L := L + 1
END; { WHILE }
Outlin(Xlael); { print a line }
FOR J := 1 TO Linel DO
Out[J] := Blank { lank line }
END; { if Iskip }
IF (X[L] - (Xnext + 0.5 * Xscale))*SignXs > 0.0
THEN Iskip := True
ELSE
BEGIN
Iskip := False;
Xlael := Xnext;
Setup(L) { Setup print line }
END
END; { FOR loop }
Outlin(Xhigh); { last line }
Write(' ');
FOR I := 1 TO 6 DO
Write(' ^ ');
WriteLn;
Write(' ');
FOR I := 1 TO 6 DO
Write(Ylael[I]:9:1, Blank);
WriteLn;
WriteLn
END; { Plot }