Last active
August 25, 2020 19:51
-
-
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…
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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