IDENTIFICATION DIVISION. PROGRAM-ID. TEST21. ENVIRONMENT DIVISION. CONFIGURATION SECTION. * SPECIAL-NAMES. * DECIMAL-POINT IS PERIOD. * INPUT-OUTPUT SECTION. * FILE-CONTROL. DATA DIVISION. FILE SECTION. WORKING-STORAGE SECTION. 01 WS-IDX PIC 9(3). 01 WS-IDX1 PIC 9(3). 01 WS-IDX2 PIC 9(3). 01 IDX PIC 9(3). 01 IDX2 PIC 9(3) COMP. * 01 IDX1 PIC 9(3). 01 WS-RCODE PIC Z(4)9 VALUE ZERO. 01 WS-TABLE1-ENTRIES. 05 FILLER PIC X(20) VALUE '001MIS '. 05 FILLER PIC X(20) VALUE '002PAYROLL '. 05 FILLER PIC X(20) VALUE '003SALES '. 05 FILLER PIC X(20) VALUE '004SHIPPING '. 05 FILLER PIC X(20) VALUE '005ACCOUNTING '. 05 FILLER PIC X(20) VALUE '006DEPT1 '. 05 FILLER PIC X(20) VALUE '007DEPT2 '. 05 FILLER PIC X(20) VALUE '008DEPT3 '. 05 FILLER PIC X(20) VALUE '009DEPT4 '. 05 FILLER PIC X(20) VALUE '010OTHERS '. 01 WS-TABLE1 REDEFINES WS-TABLE1-ENTRIES. 05 WS-TABLE1-ENTRY OCCURS 10 TIMES INDEXED BY IDX1. 10 WS-TABLE1-IDX PIC 9(3). 10 WS-TABLE1-DATA PIC X(17). PROCEDURE DIVISION. A-000. DISPLAY "ENTER A-000:". DISPLAY "BEGIN: PERFORM TESTS". DISPLAY "BEGIN: IF/ELSE TESTS". MOVE 1 TO IDX. PERFORM A-100. DISPLAY "END : IF/ELSE TESTS". DISPLAY "BEGIN: PERFORM UNTIL TEST". MOVE 1 TO IDX. PERFORM A-200 THRU A-200-EXIT WITH TEST BEFORE UNTIL IDX EQUAL 3. DISPLAY "END : PERFORM UNTIL TEST". DISPLAY "BEGIN: PERFORM TIMES TEST". MOVE 1 TO IDX. PERFORM A-200 THRU A-200-EXIT 3 TIMES. DISPLAY "END : PERFORM TIMES TEST". DISPLAY "BEGIN: PERFORM VARYING TEST". PERFORM A-300 THRU A-300-EXIT VARYING IDX FROM 1 BY 2 UNTIL IDX EQUAL 5. DISPLAY "END : PERFORM VARYING TEST". DISPLAY "BEGIN: PERFORM (in-line) TEST". MOVE 1 TO IDX. PERFORM IF IDX EQUAL 1 THEN DISPLAY "IF - IDX =" IDX "." ELSE DISPLAY "ELSE - IDX =" IDX "." END-IF ADD 1 TO IDX END-PERFORM. DISPLAY "END : PERFORM (in-line) TEST". DISPLAY "BEGIN: PERFORM (in-line) TIMES TEST". MOVE 1 TO IDX. PERFORM 3 TIMES IF IDX EQUAL 1 THEN DISPLAY "IF - IDX =" IDX "." ELSE DISPLAY "ELSE - IDX =" IDX "." END-IF ADD 1 TO IDX END-PERFORM. DISPLAY "END : PERFORM (in-line) TIMES TEST". DISPLAY "BEGIN: PERFORM (in-line) UNTIL TEST". MOVE 1 TO IDX. PERFORM UNTIL IDX EQUAL 3 IF IDX EQUAL 1 THEN DISPLAY "IF - IDX =" IDX "." ELSE DISPLAY "ELSE - IDX =" IDX "." END-IF ADD 1 TO IDX END-PERFORM. DISPLAY "END : PERFORM (in-line) UNTIL TEST". DISPLAY "BEGIN: PERFORM (in-line) VARYING TEST". PERFORM VARYING IDX FROM 1 BY 2 UNTIL IDX EQUAL 5 DISPLAY "IF/ELSE - IDX =" IDX "." PERFORM A-300 THRU A-300-EXIT * END-PERFORM END-PERFORM. DISPLAY "END : PERFORM (in-line) VARYING TEST". DISPLAY "BEGIN: PERFORM (in-line) VARYING, CONTINUE TEST". PERFORM VARYING IDX FROM 1 BY 2 UNTIL IDX EQUAL 5 CONTINUE END-PERFORM. DISPLAY "PERFORM (in-line) VARYING, CONTINUE - IDX =" IDX ".". DISPLAY "END : PERFORM (in-line) VARYING, CONTINUE TEST". DISPLAY "BEGIN: PERFORM (nested in-line) UNTIL TEST". MOVE 1 TO IDX. PERFORM UNTIL IDX EQUAL 3 PERFORM ADD 1 TO IDX END-PERFORM END-PERFORM. DISPLAY "PERFORM (nested in-line) UNTIL - IDX =" IDX ".". DISPLAY "END : PERFORM (nested in-line) UNTIL TEST". DISPLAY "END : PERFORM TESTS". DISPLAY "BEGIN: SEARCH TEST". PERFORM A-995. DISPLAY "END : SEARCH TEST". MOVE RETURN-CODE TO WS-RCODE. DISPLAY "WS-RCODE=" WS-RCODE. DISPLAY "EXIT A-000:". STOP RUN. A-100. DISPLAY "ENTER A-100:". MOVE 99 TO WS-IDX. MOVE 1 TO WS-IDX1. MOVE 2 TO WS-IDX2. DISPLAY "A-100: WS-IDX1 ==" WS-IDX1 " WS-IDX2 ==" WS-IDX2 " WS-IDX ==" WS-IDX. IF ( WS-IDX1 EQUAL 1 ) AND ( WS-IDX2 EQUAL 2 ) THEN DISPLAY "TEST1 (True): WS-IDX1 == 1 AND WS-IDX2 == 2" ELSE DISPLAY "TEST1 (False): WS-IDX1 != 1 OR WS-IDX2 != 2" END-IF. IF WS-IDX1 EQUAL 3 DISPLAY "TEST2 (True): WS-IDX1 == 3" ELSE DISPLAY "TEST2 (False): WS-IDX1 != 3" END-IF. IF WS-IDX EQUAL 99 DISPLAY "TEST3 (True): WS-IDX == 99" ELSE DISPLAY "TEST3 (False): WS-IDX != 99". * Note: This implementation of CONTINUE statement does not * conform to the ANSI85 standard. * IF WS-IDX NOT EQUAL 99 IF WS-IDX EQUAL 99 DISPLAY "TEST3-1 (True): WS-IDX == 99" * NEXT SENTENCE * CONTINUE ELSE * DISPLAY "TEST3-1 (True): WS-IDX == 99" NEXT SENTENCE END-IF. DISPLAY "EXIT A-100". A-200. DISPLAY "ENTER A-200". DISPLAY "IDX =" IDX ".". ADD 1 TO IDX DISPLAY "EXIT A-200". A-200-EXIT. DISPLAY "ENTER A-200-EXIT". DISPLAY "EXIT A-200-EXIT". A-300. DISPLAY "ENTER A-300". DISPLAY "IDX =" IDX ".". DISPLAY "EXIT A-300". A-300-EXIT. DISPLAY "ENTER A-300-EXIT". DISPLAY "EXIT A-300-EXIT". A-995. DISPLAY "ENTER A-995:". MOVE 3 TO WS-IDX1. PERFORM A-1000. MOVE 33 TO WS-IDX1. PERFORM A-1000. MOVE 3 TO WS-IDX1. PERFORM A-1010. MOVE 33 TO WS-IDX1. PERFORM A-1010. DISPLAY "EXIT A-995". A-995-EXIT. A-1000. DISPLAY "ENTER A-1000". SET IDX1 TO 1. * SET IDX2 TO 1. * MOVE 1 TO IDX1. SEARCH WS-TABLE1-ENTRY * VARYING IDX2 AT END PERFORM A-1400 WHEN WS-IDX1 = WS-TABLE1-IDX (IDX1) * WHEN WS-IDX1 = WS-TABLE1-IDX (IDX2) * NEXT SENTENCE. MOVE 0 TO WS-IDX PERFORM A-1300 END-SEARCH. DISPLAY "EXIT A-1000". A-1010. DISPLAY "ENTER A-1010". * SET IDX1 TO 1. SET IDX2 TO 1. * MOVE 1 TO IDX1. SEARCH WS-TABLE1-ENTRY VARYING IDX2 AT END PERFORM A-1410 * WHEN WS-IDX1 = WS-TABLE1-IDX (IDX1) WHEN WS-IDX1 = WS-TABLE1-IDX (IDX2) * NEXT SENTENCE. MOVE 0 TO WS-IDX PERFORM A-1310. DISPLAY "EXIT A-1010". A-1300. DISPLAY "ENTER A-1300". MOVE IDX1 TO WS-RCODE. DISPLAY "Data found ... IDX1=" WS-RCODE. DISPLAY "WS-TABLE1-IDX =" WS-TABLE1-IDX (IDX1) ":". DISPLAY "WS-TABLE1-DATA =" WS-TABLE1-DATA (IDX1) ":". DISPLAY "EXIT A-1300". A-1310. DISPLAY "ENTER A-1310". MOVE IDX2 TO WS-RCODE. DISPLAY "Data found ... IDX2=" WS-RCODE. DISPLAY "WS-TABLE1-IDX =" WS-TABLE1-IDX (IDX2) ":". DISPLAY "WS-TABLE1-DATA =" WS-TABLE1-DATA (IDX2) ":". DISPLAY "EXIT A-1310". A-1400. DISPLAY "ENTER A-1400". DISPLAY "Data WS-IDX1 =" WS-IDX1 " not found in table WS-TABLE1". MOVE IDX1 TO WS-RCODE. DISPLAY "Index max IDX1 =" WS-RCODE. DISPLAY "EXIT A-1400". A-1410. DISPLAY "ENTER A-1410". DISPLAY "Data WS-IDX1 =" WS-IDX1 " not found in table WS-TABLE1". MOVE IDX2 TO WS-RCODE. DISPLAY "Index max IDX2 =" WS-RCODE. DISPLAY "EXIT A-1410".