Back to first page...

A Typical COBOL Program

The following piece of COBOL code is a COMPLETE program; ready to compile and run...

Please do not try to understand all language constructs in this example; but have thorough look at all the lines and try to get acquainted with the language.

       IDENTIFICATION DIVISION.
       PROGRAM-ID.  "sorttest".
      *
      *	Title:	sorttest.cbl
      *		RM/COBOL-85 Sort Test
      *
      *
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SOURCE-COMPUTER.  RMCOBOL-85.
       OBJECT-COMPUTER.  RMCOBOL-85.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT SORT-FILE ASSIGN TO DISK "sortwork".
           SELECT MERGE-1 ASSIGN TO DISK "merge1fl".
           SELECT MERGE-2 ASSIGN TO DISK "merge2fl".
      *
       DATA DIVISION.
       FILE SECTION.
       SD  SORT-FILE.
       01  SORT-RECORD.
           02  RECORD-NUMBER            PIC 99.
           02                           PIC X(04).
           02  NAME                     PIC X(10).
           02                           PIC X(4).
           02  ZIP                      PIC 9(5).
           02                           PIC X(04).
           02  FILE-NUMBER              PIC 9.

       FD  MERGE-1
           BLOCK CONTAINS 8 RECORDS
           DATA RECORD IS MERGE1-OUT-RECORD.
       01  MERGE1-OUT-RECORD            PIC X(30).

       FD  MERGE-2
           BLOCK CONTAINS 8 RECORDS
           DATA RECORD IS MERGE2-OUT-RECORD.
       01  MERGE2-OUT-RECORD            PIC X(30).
      *
       WORKING-STORAGE SECTION.
       01  TITLE                 PIC X(60) VALUE
           "RM/COBOL-85 Verify SORT/MERGE functions - Version 5.20".

       01  DATA-AREA.
           02  DATA-FILLER.
               03  PIC X(15) VALUE "SMITH     01023".
               03  PIC X(15) VALUE "JONES     90274".
               03  PIC X(15) VALUE "SMITH     90024".
               03  PIC X(15) VALUE "BROWN     02345".
               03  PIC X(15) VALUE "WONG      01456".
               03  PIC X(15) VALUE "JONES     45729".
               03  PIC X(15) VALUE "SMITH     78945".
               03  PIC X(15) VALUE "ADAMS     38217".
               03  PIC X(15) VALUE "SMITH     38217".
               03  PIC X(15) VALUE "MORRIS    86721".
               03  PIC X(15) VALUE "SMITH     01023".
               03  PIC X(15) VALUE "ROBERTS   46575".
               03  PIC X(15) VALUE "YOUNG     72365".
               03  PIC X(15) VALUE "SMITH     58724".
               03  PIC X(15) VALUE "STEVENSON 24345".
               03  PIC X(15) VALUE "DAVID     89431".
               03  PIC X(15) VALUE "SMITH     68752".
               03  PIC X(15) VALUE "JACKSON   31547".
           02  TEST-DATA  REDEFINES DATA-FILLER OCCURS 18 TIMES.
               03  TEST-NAME           PIC X(10).
               03  TEST-ZIP            PIC 9(5).

       01  COUNT-WK                    PIC 99 BINARY VALUE ZEROS.

       01  TEMP-X                      PIC X.

       01  CRT-LINE                    PIC 99 BINARY.
       77  ALTERNATING-FLAG            PIC 9 VALUE 1.
       77  SORT-AT-END                 PIC 9 VALUE 1.
      *
       PROCEDURE DIVISION.
       MAIN-PGM.
           DISPLAY TITLE, LOW, LINE 1, ERASE.

           DISPLAY "This is a demonstration of the SORT/MERGE feature.",
                       LOW, LINE 4, POSITION 10.
           DISPLAY "Press any key to start SORT demonstration ...",
                       LOW, LINE 24, BLINK.
           ACCEPT TEMP-X, LOW, POSITION 0.

           DISPLAY "Sort by ZIP and name in ascending order and ",
                       LOW, LINE 1, ERASE,
                   "record number in descending order.", LOW,

                   "These are the unsorted records",
                       LOW, LINE 2, POSITION 1,
                   "These are the sorted records",
                       LOW, LINE 2, POSITION 41,
                   "Rec #   Name         ZIP",
                       LOW, LINE 3, POSITION 1,
                   "Rec #   Name         ZIP",
                       LOW, LINE 3, POSITION 41.

           SORT SORT-FILE
                   ON ASCENDING KEY ZIP, NAME
                   ON DESCENDING KEY RECORD-NUMBER
                   INPUT PROCEDURE IS INPUT-SORT
                   OUTPUT PROCEDURE IS OUTPUT-SORT.


           DISPLAY "Press any key to start MERGE demonstration ...",
                       LOW, LINE 24, BLINK.
           ACCEPT TEMP-X, LOW, POSITION 0.
      *
           DISPLAY "Merge by ZIP and name in ascending order and ",
                       LOW, LINE 1, ERASE
                   "record number in descending order", LOW.

           DISPLAY "This is a list of file number 1", LOW, LINE 2.
           DISPLAY "Rec #   Name         ZIP  File #", LOW, LINE 3.
           DISPLAY "This is a list of file number 2", LOW, LINE 14.
           DISPLAY "Rec #   Name         ZIP  File #", LOW, LINE 15.
           DISPLAY "This is a list of the merged files",
                       LOW, LINE 2, POSITION 41,
                   "Rec #   Name         ZIP  File #",
                       LOW, LINE 3, POSITION 41.

           OPEN INPUT MERGE-1 WITH LOCK.
           MOVE 4 TO CRT-LINE.
           MOVE ZERO TO SORT-AT-END.
           PERFORM UNTIL SORT-AT-END = 1
               READ MERGE-1 AT END MOVE 1 TO SORT-AT-END  END-READ
               IF  SORT-AT-END NOT = 1
                   DISPLAY MERGE1-OUT-RECORD, LOW, LINE CRT-LINE
                   ADD 1 TO CRT-LINE
               END-IF
           END-PERFORM.
           CLOSE MERGE-1.

           OPEN INPUT MERGE-2 WITH LOCK.
           MOVE 16 TO CRT-LINE.
           MOVE ZERO TO SORT-AT-END.
           PERFORM UNTIL SORT-AT-END = 1
               READ MERGE-2 AT END MOVE 1 TO SORT-AT-END END-READ
               IF SORT-AT-END NOT = 1
                   DISPLAY MERGE2-OUT-RECORD, LOW, LINE CRT-LINE
                   ADD 1 TO CRT-LINE
               END-IF
           END-PERFORM.
           CLOSE MERGE-2.

           MERGE SORT-FILE
                   ON ASCENDING KEY ZIP, NAME
                   ON DESCENDING KEY RECORD-NUMBER
                   USING MERGE-1 MERGE-2
                   OUTPUT PROCEDURE OUTPUT-MERGE.

           DISPLAY "End of demonstration.  ", HIGH, LINE 23, POSITION 50,
                   "Press any key to continue ...", HIGH, 
                       LINE 24, POSITION 50.
           ACCEPT TEMP-X, LOW, POSITION 0.

           DELETE FILE MERGE-1.
           DELETE FILE MERGE-2.
           EXIT PROGRAM.
           STOP RUN.
      *

       INPUT-SORT.
           MOVE SPACES TO SORT-RECORD.
           PERFORM VARYING COUNT-WK FROM 1 BY 1 UNTIL COUNT-WK > 18
               MOVE COUNT-WK TO RECORD-NUMBER
               MOVE TEST-NAME (COUNT-WK) TO NAME
               MOVE TEST-ZIP  (COUNT-WK) TO ZIP
               ADD 4, COUNT-WK GIVING CRT-LINE
               DISPLAY SORT-RECORD, LOW, LINE CRT-LINE
               RELEASE SORT-RECORD
           END-PERFORM.


       OUTPUT-SORT.
           OPEN OUTPUT MERGE-1 WITH LOCK.
           OPEN OUTPUT MERGE-2 WITH LOCK.
           MOVE ZERO TO SORT-AT-END.
           MOVE 0 TO ALTERNATING-FLAG.
           MOVE 5 TO CRT-LINE.
           PERFORM UNTIL SORT-AT-END = 1
               RETURN SORT-FILE RECORD AT END MOVE 1 TO SORT-AT-END
               END-RETURN
               IF SORT-AT-END NOT = 1
                   DISPLAY SORT-RECORD
                               LOW, LINE CRT-LINE, POSITION 41
                   ADD 1 TO CRT-LINE
                   IF ALTERNATING-FLAG = 1
                       MOVE 1 TO FILE-NUMBER
                       WRITE MERGE1-OUT-RECORD FROM SORT-RECORD
                       MOVE ZERO TO ALTERNATING-FLAG
                   ELSE
                       MOVE 2 TO FILE-NUMBER
                       WRITE MERGE2-OUT-RECORD FROM SORT-RECORD
                       MOVE 1 TO ALTERNATING-FLAG
                   END-IF
               END-IF
           END-PERFORM.
           CLOSE MERGE-1 MERGE-2.
      *

       OUTPUT-MERGE.
           MOVE ZERO TO SORT-AT-END.
           MOVE 4 TO CRT-LINE.
           PERFORM UNTIL SORT-AT-END = 1
               RETURN SORT-FILE RECORD AT END MOVE 1 TO SORT-AT-END
               END-RETURN
               IF SORT-AT-END  NOT = 1
                   DISPLAY SORT-RECORD
                               LOW, LINE CRT-LINE, POSITION 41
                   ADD 1 TO CRT-LINE
               END-IF
           END-PERFORM.

I am sure that everyone will easily understand WHAT the program is supposed to do. Understanding HOW it does what it is supposed to do is the object of this course...

In the next section, I shall go over parts of the above program. It might be helpful for you to open a new Web browser window and keep both this page and the next section on your desktop. If you are using Netscape, try "File - New Web Browser" command...