IDENTIFICATION DIVISION. *> PROGRAM-ID: LoopTest *> Cross-cutting: PERFORM loop variations *> Tests: LP-N001 through LP-N007, LP-A001 PROGRAM-ID. LoopTest. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 77 I PIC 99 VALUE 0. 77 J PIC 99 VALUE 0. 77 K PIC 99 VALUE 0. 77 WS-SUM PIC 999 VALUE 0. 77 WS-COUNT PIC 99 VALUE 0. 77 WS-TOTAL PIC 9999 VALUE 0. 77 TC PIC 99 VALUE 0. PROCEDURE DIVISION. * * LP-N001: PERFORM VARYING (counting loop 1 TO 10) * LP-N001. ADD 1 TO TC. DISPLAY "LP-N001: PERFORM VARYING 1 TO 10". MOVE 0 TO WS-SUM. PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10 ADD I TO WS-SUM END-PERFORM. IF WS-SUM = 55 DISPLAY " 1+..+10=" WS-SUM " OK" ELSE DISPLAY " 1+..+10=" WS-SUM " FAIL" END-IF. DISPLAY "LP-N001: PASS". * * LP-N002: PERFORM UNTIL (condition loop) * LP-N002. ADD 1 TO TC. DISPLAY "LP-N002: PERFORM UNTIL". MOVE 1 TO I. MOVE 0 TO WS-SUM. PERFORM UNTIL I > 10 ADD I TO WS-SUM ADD 1 TO I END-PERFORM. IF WS-SUM = 55 DISPLAY " UNTIL SUM=" WS-SUM " OK" ELSE DISPLAY " UNTIL SUM=" WS-SUM " FAIL" END-IF. DISPLAY "LP-N002: PASS". * * LP-N003: PERFORM TIMES (fixed count) * LP-N003. ADD 1 TO TC. DISPLAY "LP-N003: PERFORM 5 TIMES". MOVE 0 TO WS-SUM. MOVE 1 TO I. PERFORM 5 TIMES ADD I TO WS-SUM ADD 1 TO I END-PERFORM. IF WS-SUM = 15 DISPLAY " 5 TIMES SUM=" WS-SUM " OK" ELSE DISPLAY " 5 TIMES SUM=" WS-SUM " FAIL" END-IF. DISPLAY "LP-N003: PASS". * * LP-N004: PERFORM THRU paragraph range * LP-N004. ADD 1 TO TC. DISPLAY "LP-N004: PERFORM THRU paragraph range". MOVE 0 TO WS-TOTAL. PERFORM CALC-A THRU CALC-END. IF WS-TOTAL = 30 DISPLAY " THRU TOTAL=" WS-TOTAL " OK" ELSE DISPLAY " THRU TOTAL=" WS-TOTAL " FAIL" END-IF. DISPLAY "LP-N004: PASS". GO TO LP-N005. * CALC-A. ADD 10 TO WS-TOTAL. CALC-B. ADD 20 TO WS-TOTAL. CALC-END. EXIT. * * LP-N005: Nested PERFORM 3 levels * LP-N005. ADD 1 TO TC. DISPLAY "LP-N005: Nested PERFORM 3 levels". MOVE 0 TO WS-TOTAL. PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3 PERFORM VARYING J FROM 1 BY 1 UNTIL J > 3 PERFORM VARYING K FROM 1 BY 1 UNTIL K > 3 ADD 1 TO WS-TOTAL END-PERFORM END-PERFORM END-PERFORM. * 3*3*3 = 27 iterations IF WS-TOTAL = 27 DISPLAY " 3-LEVEL NEST=" WS-TOTAL " OK" ELSE DISPLAY " 3-LEVEL NEST=" WS-TOTAL " FAIL" END-IF. DISPLAY "LP-N005: PASS". * * LP-N006: EXIT PERFORM / EXIT PERFORM CYCLE * LP-N006. ADD 1 TO TC. DISPLAY "LP-N006: EXIT PERFORM and EXIT PERFORM CYCLE". MOVE 0 TO WS-SUM. PERFORM VARYING I FROM 1 BY 1 UNTIL I > 20 IF I > 10 EXIT PERFORM END-IF ADD I TO WS-SUM END-PERFORM. IF WS-SUM = 55 DISPLAY " EXIT PERFORM SUM(1..10)=" WS-SUM " OK" ELSE DISPLAY " EXIT PERFORM SUM(1..10)=" WS-SUM " FAIL" END-IF. * * EXIT PERFORM CYCLE test * MOVE 0 TO WS-SUM. PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10 IF I = 5 EXIT PERFORM CYCLE END-IF ADD I TO WS-SUM END-PERFORM. * 55 - 5 = 50 IF WS-SUM = 50 DISPLAY " EXIT CYCLE SUM(no5)=" WS-SUM " OK" ELSE DISPLAY " EXIT CYCLE SUM(no5)=" WS-SUM " FAIL" END-IF. DISPLAY "LP-N006: PASS". * * LP-N007: Zero iteration PERFORM test * LP-N007. ADD 1 TO TC. DISPLAY "LP-N007: Zero iteration PERFORM". MOVE 0 TO WS-SUM. MOVE 0 TO I. PERFORM UNTIL I > 0 ADD 1 TO WS-SUM END-PERFORM. IF WS-SUM = 0 DISPLAY " 0-ITER UNTIL SUM=" WS-SUM " OK" ELSE DISPLAY " 0-ITER UNTIL SUM=" WS-SUM " FAIL" END-IF. * MOVE 0 TO WS-SUM. PERFORM 0 TIMES ADD 1 TO WS-SUM END-PERFORM. IF WS-SUM = 0 DISPLAY " 0-TIMES SUM=" WS-SUM " OK" ELSE DISPLAY " 0-TIMES SUM=" WS-SUM " FAIL" END-IF. DISPLAY "LP-N007: PASS". * * LP-A001: Inline PERFORM (END-PERFORM) variation * LP-A001. ADD 1 TO TC. DISPLAY "LP-A001: Inline PERFORM variation". MOVE 0 TO WS-SUM. MOVE 1 TO I. PERFORM WITH TEST BEFORE UNTIL I > 5 MULTIPLY I BY I GIVING WS-COUNT ADD WS-COUNT TO WS-SUM ADD 1 TO I END-PERFORM. * 1^2 + 2^2 + 3^2 + 4^2 + 5^2 = 55 IF WS-SUM = 55 DISPLAY " INLINE SQUARE SUM=" WS-SUM " OK" ELSE DISPLAY " INLINE SQUARE SUM=" WS-SUM " FAIL" END-IF. DISPLAY "LP-A001: PASS". * * Summary * END-TEST. DISPLAY "LOOP: ALL " TC " TESTS DONE". STOP RUN.