How to create an array containing a range of numbers (range(a, b)) in COBOL

1 Answer

0 votes
*> ===============================================================
*> MAIN PROGRAM - demo of range(WS-A , WS-B)
*> ===============================================================
 IDENTIFICATION DIVISION.
 PROGRAM-ID. RANGEDEMO.
 DATA DIVISION.
 WORKING-STORAGE SECTION.
*> Range bounds (a, b)
 01  WS-A                 PIC S9(9) COMP VALUE 3.
 01  WS-B                 PIC S9(9) COMP VALUE 8.
*> Result table: WS-COUNT holds the number of valid elements
 01  WS-RESULT.
     05  WS-COUNT         PIC 9(4) COMP VALUE 0.
     05  WS-ITEM          PIC S9(9) COMP
                          OCCURS 1 TO 1000 TIMES
                          DEPENDING ON WS-COUNT.
 01  WS-RC                PIC S9(4) COMP VALUE 0.
 01  WS-I                 PIC 9(4) COMP.
 01  WS-VAL-OUT           PIC -(9)9.
 PROCEDURE DIVISION.
 MAIN-PARA.
     CALL "RANGEARR" USING WS-A WS-B WS-RESULT WS-RC
     END-CALL
*> Always check the return code
     IF WS-RC NOT = 0
         DISPLAY "Error: range exceeds table capacity (1000)"
         STOP RUN
     END-IF
     PERFORM PRINT-ARRAY
     STOP RUN.
*> Plain output: all values on one line, separated by spaces
 PRINT-ARRAY.
     PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > WS-COUNT
         MOVE WS-ITEM(WS-I) TO WS-VAL-OUT
         DISPLAY FUNCTION TRIM(WS-VAL-OUT) " "
                 WITH NO ADVANCING
     END-PERFORM
*> Finish the line
     DISPLAY SPACE.
 END PROGRAM RANGEDEMO.
*> ===============================================================
*> SUBPROGRAM RANGEARR - equivalent of range(a, b)
*> Fills a table with a..b (inclusive). If b < a the range
*> is descending, like PHP.
*>
*>   LS-A     : first value
*>   LS-B     : last value
*>   LS-RESULT: output table (count + items)
*>   LS-RC    : 0 = OK, 1 = too many elements for the table
*> ===============================================================
 IDENTIFICATION DIVISION.
 PROGRAM-ID. RANGEARR.
 DATA DIVISION.
 WORKING-STORAGE SECTION.
 01  WS-MAX-ITEMS         PIC 9(4) COMP VALUE 1000.
 01  WS-DIRECTION         PIC S9   COMP.   *> +1 or -1
 01  WS-N                 PIC 9(9) COMP.   *> number of elements
 01  WS-I                 PIC 9(9) COMP.
 LINKAGE SECTION.
 01  LS-A                 PIC S9(9) COMP.
 01  LS-B                 PIC S9(9) COMP.
 01  LS-RESULT.
     05  LS-COUNT         PIC 9(4) COMP.
     05  LS-ITEM          PIC S9(9) COMP
                          OCCURS 1 TO 1000 TIMES
                          DEPENDING ON LS-COUNT.
 01  LS-RC                PIC S9(4) COMP.
 PROCEDURE DIVISION USING LS-A LS-B LS-RESULT LS-RC.
 MAIN-PARA.
     MOVE 0 TO LS-RC
     MOVE 0 TO LS-COUNT
*> 1. Direction and number of elements
     IF LS-B >= LS-A
         MOVE 1 TO WS-DIRECTION
     ELSE
         MOVE -1 TO WS-DIRECTION
     END-IF
     COMPUTE WS-N = FUNCTION ABS(LS-B - LS-A) + 1
*> 2. Guard against overflowing the table
     IF WS-N > WS-MAX-ITEMS
         MOVE 1 TO LS-RC
         GOBACK
     END-IF
*> 3. Set the logical size FIRST, then fill the table
     MOVE WS-N TO LS-COUNT
     PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > WS-N
         COMPUTE LS-ITEM(WS-I) = LS-A + (WS-DIRECTION * (WS-I - 1))
     END-PERFORM
     GOBACK.
 END PROGRAM RANGEARR.


*> run:
*>
*> Array
*> (
*>     [0] => 3
*>     [1] => 4
*>     [2] => 5
*>     [3] => 6
*>     [4] => 7
*>     [5] => 8
*> )

 



answered 2 days ago by avibootz
edited 2 days ago by avibootz
...