Skip to content

Instantly share code, notes, and snippets.

@piotrmaslanka
Last active August 25, 2020 19:51
Show Gist options
  • Save piotrmaslanka/5321826 to your computer and use it in GitHub Desktop.
Save piotrmaslanka/5321826 to your computer and use it in GitHub Desktop.
A function "plotter" in COBOL for z/OS mainframes.SYSIN should be a single record in form (for example)150 150 +1.000E-01 +0.000E-00where first two are maximum rows and columns of output dataset, and the rest are coefficients of a linear function that X is first passed thru (it normally goes from 1 to maxrows).Output dataset has name PLOTOUT. Re…
IDENTIFICATION DIVISION.
PROGRAM-ID ELOGRECO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FD-PLOTOUT ASSIGN PLOTOUT
ORGANIZATION IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD FD-PLOTOUT.
01 FD-PLOTFILE.
02 FD-ROW OCCURS 300 TIMES.
03 FD-CHAR PIC X.
WORKING-STORAGE SECTION.
01 V-MAX COMP-2.
01 V-MIN COMP-2.
01 PSK-A COMP-2.
01 PSK-B COMP-2.
01 PPSK-A PIC S9999V9999 USAGE IS COMP.
01 XPSK-A REDEFINES PPSK-A PIC X(10).
01 PPSK-B PIC S9999V9999 USAGE IS COMP.
01 XPSK-B REDEFINES PPSK-B PIC X(10).
01 G-COLS PIC 9999.
01 G-ROWS PIC 9999.
01 NV-TABLE.
02 NV-CNTVAL OCCURS 300 TIMES.
03 NV-VAL PIC 9999.
01 IV-TABLE.
02 IV-CNTVAL OCCURS 300 TIMES.
03 IV-VAL COMP-2.
01 I PIC 9999.
01 IPLUS PIC 9999.
01 J PIC 9999.
01 X COMP-2.
01 Y COMP-2.
PROCEDURE DIVISION.
OPEN OUTPUT FD-PLOTOUT.
ACCEPT FD-PLOTFILE
UNSTRING FD-PLOTFILE DELIMITED BY ALL SPACES
INTO G-COLS, G-ROWS, PPSK-A, PPSK-B
END-UNSTRING.
SUBTRACT 1 FROM G-ROWS GIVING G-ROWS.
MOVE -99999999.999 TO V-MAX.
MOVE 99999999.999 TO V-MIN.
COMPUTE PSK-A = PPSK-A.
COMPUTE PSK-B = PPSK-B.
PERFORM VARYING I FROM 1 BY 1 UNTIL I = G-COLS + 1
MOVE I TO X
MULTIPLY X BY PSK-A GIVING X
ADD PSK-B TO X GIVING X
COMPUTE Y = FUNCTION SIN(X) * X
MOVE Y TO IV-VAL(I)
IF Y > V-MAX
MOVE Y TO V-MAX
END-IF
IF Y < V-MIN
MOVE Y TO V-MIN
END-IF
END-PERFORM
PERFORM VARYING I FROM 1 BY 1 UNTIL I = G-COLS + 1
MOVE IV-VAL(I) TO Y
COMPUTE Y = (Y - V-MIN) * (G-ROWS + 0)
COMPUTE Y = Y / (V-MAX - V-MIN)
COMPUTE Y ROUNDED = G-ROWS - Y + 1
MOVE Y TO NV-VAL(I)
END-PERFORM
PERFORM VARYING J FROM 1 BY 1 UNTIL J = (G-ROWS + 2)
MOVE SPACES TO FD-PLOTFILE
PERFORM VARYING I FROM 1 BY 1 UNTIL I = G-COLS + 1
IF I = G-COLS
IF NV-VAL(I) = J
MOVE "." TO FD-CHAR(I)
END-IF
END-IF
IF I < (G-COLS - 1)
ADD 1 TO I GIVING IPLUS
IF (NV-VAL(I) > J) AND (NV-VAL(IPLUS) < J)
MOVE "." TO FD-CHAR(I)
END-IF
IF (NV-VAL(I) < J) AND (NV-VAL(IPLUS) > J)
MOVE "." TO FD-CHAR(I)
END-IF
IF NV-VAL(I) = J
MOVE "." TO FD-CHAR(I)
END-IF
END-IF
END-PERFORM
WRITE FD-PLOTFILE
END-PERFORM
CLOSE FD-PLOTOUT.
STOP RUN.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment