       IDENTIFICATION DIVISION.
       PROGRAM-ID. READ3WGT1LINESORT.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
           COPY "OPTIONAL.CPY".

       DATA DIVISION.
       FILE SECTION.

       FD  FIETS-FILE.
       01  FIETS-REC.
           05 F-DATE       PIC X(8).
           05 F-DIST       PIC 9(5).
           05 F-TIMESEC    PIC 9(5).
           05 F-HR         PIC 9(3).
           05 F-WGT        PIC 9(3).

       FD  LOOP-FILE.
       01  LOOP-REC.
           05 L-DATE       PIC X(8).
           05 L-DIST       PIC 9(5).
           05 L-TIMESEC    PIC 9(5).
           05 L-HR         PIC 9(3).
           05 L-WGT        PIC 9(3).

       FD  ZWEM-FILE.
       01  ZWEM-REC.
           05 Z-DATE       PIC X(8).
           05 Z-DIST       PIC 9(5).
           05 Z-TIMESEC    PIC 9(5).
           05 Z-HR         PIC 9(3).
           05 Z-WGT        PIC 9(3).

       WORKING-STORAGE SECTION.

       01  EOF-FIETS       PIC X VALUE "N".
       01  EOF-LOOP        PIC X VALUE "N".
       01  EOF-ZWEM        PIC X VALUE "N".

       01  REC-IDX         PIC 9(4) VALUE 0.

       01  QS-L            PIC 9(4).
       01  QS-R            PIC 9(4).
       01  QS-TOP          PIC 9(4) VALUE 0.
       01  QS-I            PIC 9(4).
       01  QS-J            PIC 9(4).

       01  PIVOT           PIC X(8).

       01  QS-STKL OCCURS 500 TIMES PIC 9(4).
       01  QS-STKR OCCURS 500 TIMES PIC 9(4).

       01  TEMP-REC.
           05 T-SPT        PIC X(5).
           05 T-DATE       PIC X(8).
           05 T-DIST       PIC 9(5).
           05 T-TIMESEC    PIC 9(5).
           05 T-HR         PIC 9(3).
           05 T-WGT        PIC 9(3).

       01  ALL-RECS.
           05 A-REC OCCURS 500 TIMES.
              10 A-SPT     PIC X(5).
              10 A-DATE    PIC X(8).
              10 A-DIST    PIC 9(5).
              10 A-TIMESEC PIC 9(5).
              10 A-HR      PIC 9(3).
              10 A-WGT     PIC 9(3).

       01  WS-MIN          PIC 9(3).
       01  WS-SEC          PIC 9(2).
       01  WS-SPEED        PIC 9(3)V9(2).
       01  WS-INDEX        PIC 9(3)V9(2).

       PROCEDURE DIVISION.
       MAIN-LOGIC.

           OPEN INPUT FIETS-FILE
           OPEN INPUT LOOP-FILE
           OPEN INPUT ZWEM-FILE

           PERFORM READ-FIETS
           PERFORM UNTIL EOF-FIETS = "Y"
              ADD 1 TO REC-IDX
              MOVE "FIETS"   TO A-SPT(REC-IDX)
              MOVE F-DATE    TO A-DATE(REC-IDX)
              MOVE F-DIST    TO A-DIST(REC-IDX)
              MOVE F-TIMESEC TO A-TIMESEC(REC-IDX)
              MOVE F-HR      TO A-HR(REC-IDX)
              MOVE F-WGT     TO A-WGT(REC-IDX)
              PERFORM READ-FIETS
           END-PERFORM

           PERFORM READ-LOOP
           PERFORM UNTIL EOF-LOOP = "Y"
              ADD 1 TO REC-IDX
              MOVE "LOOP"    TO A-SPT(REC-IDX)
              MOVE L-DATE    TO A-DATE(REC-IDX)
              MOVE L-DIST    TO A-DIST(REC-IDX)
              MOVE L-TIMESEC TO A-TIMESEC(REC-IDX)
              MOVE L-HR      TO A-HR(REC-IDX)
              MOVE L-WGT     TO A-WGT(REC-IDX)
              PERFORM READ-LOOP
           END-PERFORM

           PERFORM READ-ZWEM
           PERFORM UNTIL EOF-ZWEM = "Y"
              ADD 1 TO REC-IDX
              MOVE "ZWEM"    TO A-SPT(REC-IDX)
              MOVE Z-DATE    TO A-DATE(REC-IDX)
              MOVE Z-DIST    TO A-DIST(REC-IDX)
              MOVE Z-TIMESEC TO A-TIMESEC(REC-IDX)
              MOVE Z-HR      TO A-HR(REC-IDX)
              MOVE Z-WGT     TO A-WGT(REC-IDX)
              PERFORM READ-ZWEM
           END-PERFORM

           CLOSE FIETS-FILE
           CLOSE LOOP-FILE
           CLOSE ZWEM-FILE

      *-----------------------------------------------
      * QUICKSORT ITERATIEF (ROCKET COBOL SAFE)
      *-----------------------------------------------

           MOVE 1 TO QS-L
           MOVE REC-IDX TO QS-R

           ADD 1 TO QS-TOP
           MOVE QS-L TO QS-STKL(QS-TOP)
           MOVE QS-R TO QS-STKR(QS-TOP)

           PERFORM UNTIL QS-TOP = 0

              MOVE QS-STKL(QS-TOP) TO QS-L
              MOVE QS-STKR(QS-TOP) TO QS-R
              SUBTRACT 1 FROM QS-TOP

              MOVE A-DATE(QS-L) TO PIVOT
              MOVE QS-L TO QS-I
              MOVE QS-R TO QS-J

              PERFORM UNTIL QS-I > QS-J

                 PERFORM UNTIL A-DATE(QS-I) >= PIVOT
                    ADD 1 TO QS-I
                    IF QS-I > QS-R
                       EXIT PERFORM
                    END-IF
                 END-PERFORM

                 PERFORM UNTIL A-DATE(QS-J) <= PIVOT
                    SUBTRACT 1 FROM QS-J
                    IF QS-J < QS-L
                       EXIT PERFORM
                    END-IF
                 END-PERFORM

                 IF QS-I <= QS-J
                    MOVE A-SPT(QS-I)     TO T-SPT
                    MOVE A-DATE(QS-I)    TO T-DATE
                    MOVE A-DIST(QS-I)    TO T-DIST
                    MOVE A-TIMESEC(QS-I) TO T-TIMESEC
                    MOVE A-HR(QS-I)      TO T-HR
                    MOVE A-WGT(QS-I)     TO T-WGT

                    MOVE A-SPT(QS-J)     TO A-SPT(QS-I)
                    MOVE A-DATE(QS-J)    TO A-DATE(QS-I)
                    MOVE A-DIST(QS-J)    TO A-DIST(QS-I)
                    MOVE A-TIMESEC(QS-J) TO A-TIMESEC(QS-I)
                    MOVE A-HR(QS-J)      TO A-HR(QS-I)
                    MOVE A-WGT(QS-J)     TO A-WGT(QS-I)

                    MOVE T-SPT        TO A-SPT(QS-J)
                    MOVE T-DATE       TO A-DATE(QS-J)
                    MOVE T-DIST       TO A-DIST(QS-J)
                    MOVE T-TIMESEC    TO A-TIMESEC(QS-J)
                    MOVE T-HR         TO A-HR(QS-J)
                    MOVE T-WGT        TO A-WGT(QS-J)

                    ADD 1 TO QS-I
                    SUBTRACT 1 FROM QS-J
                 END-IF

              END-PERFORM

              IF QS-L < QS-J
                 ADD 1 TO QS-TOP
                 MOVE QS-L TO QS-STKL(QS-TOP)
                 MOVE QS-J TO QS-STKR(QS-TOP)
              END-IF

              IF QS-I < QS-R
                 ADD 1 TO QS-TOP
                 MOVE QS-I TO QS-STKL(QS-TOP)
                 MOVE QS-R TO QS-STKR(QS-TOP)
              END-IF

           END-PERFORM

      *-----------------------------------------------
      * OUTPUT MET SNELHEID + INDEX
      *-----------------------------------------------

           PERFORM VARYING QS-I FROM 1 BY 1 UNTIL QS-I > REC-IDX

              COMPUTE WS-MIN = A-TIMESEC(QS-I) / 60
              COMPUTE WS-SEC = A-TIMESEC(QS-I) - (WS-MIN * 60)

              IF A-TIMESEC(QS-I) > 0
                 COMPUTE WS-SPEED =
                    A-DIST(QS-I) / A-TIMESEC(QS-I)
                 COMPUTE WS-INDEX =
                    A-HR(QS-I) / WS-SPEED
              ELSE
                 MOVE 0 TO WS-SPEED
                 MOVE 0 TO WS-INDEX
              END-IF

              DISPLAY A-SPT(QS-I) ": "
                      A-DATE(QS-I) " "
                      A-DIST(QS-I) " "
                      WS-MIN ":" WS-SEC " "
                      "SPD=" WS-SPEED " "
                      "IDX=" WS-INDEX " "
                      A-HR(QS-I) " "
                      A-WGT(QS-I)

           END-PERFORM

           STOP RUN.

       READ-FIETS.
           READ FIETS-FILE
              AT END MOVE "Y" TO EOF-FIETS.
           EXIT.

       READ-LOOP.
           READ LOOP-FILE
              AT END MOVE "Y" TO EOF-LOOP.
           EXIT.

       READ-ZWEM.
           READ ZWEM-FILE
              AT END MOVE "Y" TO EOF-ZWEM.
           EXIT.

