Tables: Election Example


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  TABLE-EXAMPLE.
       AUTHOR.      BILL ROGERS.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT IN-FILE
               ASSIGN TO 'C:\PCOBWIN\ROGERS\ELECTION.DAT'
               ORGANIZATION IS LINE SEQUENTIAL.
           SELECT OUT-FILE
               ASSIGN TO 'C:\PCOBWIN\ROGERS\REPORT.TXT'
               ORGANIZATION IS LINE SEQUENTIAL.

       DATA DIVISION.
       FILE SECTION.

       FD IN-FILE
          DATA RECORD IS IN-RECORD.
       01 IN-RECORD.
          02 CANDIDATE-CODE         PIC X.
             88 A-VOTE-FOR-BUSH     VALUE 'W'.
             88 A-VOTE-FOR-GORE     VALUE 'G'.
             88 A-VOTE-FOR-NADER    VALUE 'N'.
             88 A-VOTE-FOR-BUCHANAN VALUE 'B'.
          02 VOTER-GENDER           PIC X.
             88 MALE                VALUE 'M'.
             88 FEMALE              VALUE 'F'.

       FD OUT-FILE
          DATA RECORD IS OUT-RECORD.
       01 OUT-RECORD                PIC X(80).

       WORKING-STORAGE SECTION.

       01 DETAIL-LINE.
          02 DETAIL-GENDER          PIC X(8).
          02 DETAIL-TABLE.
             03 DETAIL-ITEM OCCURS 4 TIMES.
                04 DETAIL-COUNT     PIC Z,ZZZ,ZZ9.
                04 FILLER           PIC X(5)     VALUE SPACES.

       01 HEADER-LINE.
          02 PIC X(8)               VALUE SPACES.
          02 PIC X(14)              VALUE '     GORE'.
          02 PIC X(14)              VALUE '     BUSH'.
          02 PIC X(14)              VALUE '    NADER'.
          02 PIC X(14)              VALUE ' BUCHANAN'.

       01 ACCUMULATOR-TABLE.
          02 ACC-CANDIDATE OCCURS 4 TIMES.
             03 ACC-GENDER OCCURS 2 TIMES.
                04 ACCUMULATED-COUNT PIC 9(7).

       01 CANDIDATE-SUB             PIC 9 COMP.
       01 GENDER-SUB                PIC 9 COMP.

       01 WS-TOTAL                  PIC 9(7)     VALUE ZERO.

       01 EOF-FLAG                  PIC X        VALUE SPACE.
          88 END-OF-INPUT                        VALUE 'Y'.

       PROCEDURE DIVISION.
       MAINLINE.
           PERFORM INITIALIZATION-ROUTINE.
           PERFORM THE-LOOP
               UNTIL END-OF-INPUT.
           PERFORM PRINT-REPORT.
           PERFORM EOJ-ROUTINE.
           STOP RUN.

       INITIALIZATION-ROUTINE.
           OPEN INPUT IN-FILE.
           OPEN OUTPUT OUT-FILE.
           MOVE ZEROES TO ACCUMULATOR-TABLE.
           READ IN-FILE
               AT END MOVE 'Y' TO EOF-FLAG.

       THE-LOOP.
           EVALUATE TRUE
               WHEN A-VOTE-FOR-GORE      MOVE 1 TO CANDIDATE-SUB
               WHEN A-VOTE-FOR-BUSH      MOVE 2 TO CANDIDATE-SUB
               WHEN A-VOTE-FOR-NADER     MOVE 3 TO CANDIDATE-SUB
               WHEN A-VOTE-FOR-BUCHANAN  MOVE 4 TO CANDIDATE-SUB
           END-EVALUATE.
           EVALUATE TRUE
               WHEN MALE                 MOVE 1 TO GENDER-SUB
               WHEN FEMALE               MOVE 2 TO GENDER-SUB
           END-EVALUATE.
           ADD 1 TO ACCUMULATED-COUNT (CANDIDATE-SUB, GENDER-SUB).
           READ IN-FILE
               AT END MOVE 'Y' TO EOF-FLAG.

       PRINT-REPORT.
      * Header
           WRITE OUT-RECORD FROM HEADER-LINE.
      * Male vote
           MOVE 1 TO GENDER-SUB.
           MOVE 'MALE' TO DETAIL-GENDER.
           PERFORM MOVE-TOTALS
               VARYING CANDIDATE-SUB FROM 1 BY 1
                 UNTIL CANDIDATE-SUB > 4.
           WRITE OUT-RECORD FROM DETAIL-LINE.
      * Female vote
           MOVE 2 TO GENDER-SUB.
           MOVE 'FEMALE' TO DETAIL-GENDER.
           PERFORM MOVE-TOTALS
               VARYING CANDIDATE-SUB FROM 1 BY 1
                 UNTIL CANDIDATE-SUB > 4.
           WRITE OUT-RECORD FROM DETAIL-LINE.
      * Total vote
           MOVE 'TOTAL' TO DETAIL-GENDER.
           PERFORM FINAL-TOTALS
               VARYING CANDIDATE-SUB FROM 1 BY 1
                 UNTIL CANDIDATE-SUB > 4.
           WRITE OUT-RECORD FROM DETAIL-LINE.

       MOVE-TOTALS.
           MOVE ACCUMULATED-COUNT (CANDIDATE-SUB, GENDER-SUB)
             TO DETAIL-COUNT (CANDIDATE-SUB).

       FINAL-TOTALS.
           COMPUTE WS-TOTAL =
               ACCUMULATED-COUNT (CANDIDATE-SUB, 1) +
               ACCUMULATED-COUNT (CANDIDATE-SUB, 2).
           MOVE WS-TOTAL TO DETAIL-COUNT (CANDIDATE-SUB).

       EOJ-ROUTINE.
           CLOSE IN-FILE.
           CLOSE OUT-FILE.
Output
                     GORE          BUSH         NADER      BUCHANAN
        MALE            0             0             0             0
        FEMALE          0             0             0             0
        TOTAL           0             0             0             0

Cobol Home