typestar

word_freq.cob in COBOL

A word-frequency table built from UNSTRING, a linear search, and a hash-mark chart.

*> Count word frequencies in a passage and chart the leaders.
IDENTIFICATION DIVISION.
PROGRAM-ID. WORD-FREQ.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PASSAGE     PIC X(76) VALUE "the rain in maine falls mainly on " &
                               "the plain and the rain stays on the plain".
01 WORD-TABLE.
   05 WORD-SLOT OCCURS 12 TIMES.
      10 W-TEXT   PIC X(10).
      10 W-COUNT  PIC 99.
01 SLOT-USED   PIC 99 VALUE 0.
01 CUR-WORD    PIC X(10).
01 SCAN-PTR    PIC 99 VALUE 1.
01 IDX         PIC 99.
01 FOUND-FLAG  PIC X.
01 BAR-LINE    PIC X(20).
PROCEDURE DIVISION.
MAIN-PARA.
*> UNSTRING walks the passage word by word through its POINTER.
    PERFORM UNTIL SCAN-PTR > FUNCTION LENGTH(PASSAGE)
        MOVE SPACES TO CUR-WORD
        UNSTRING PASSAGE DELIMITED BY ALL SPACE
            INTO CUR-WORD WITH POINTER SCAN-PTR
        END-UNSTRING
        IF CUR-WORD NOT = SPACES
            PERFORM TALLY-WORD
        END-IF
    END-PERFORM
    DISPLAY SLOT-USED " distinct words"
    DISPLAY "word       ct  bar"
    PERFORM VARYING IDX FROM 1 BY 1 UNTIL IDX > SLOT-USED
        MOVE SPACES TO BAR-LINE
        MOVE ALL "#" TO BAR-LINE(1:W-COUNT(IDX))
        DISPLAY W-TEXT(IDX) " " W-COUNT(IDX) "  " BAR-LINE
    END-PERFORM
    STOP RUN.

*> Linear search: bump a known word or claim the next free slot.
TALLY-WORD.
    MOVE "N" TO FOUND-FLAG
    PERFORM VARYING IDX FROM 1 BY 1 UNTIL IDX > SLOT-USED
        IF W-TEXT(IDX) = CUR-WORD
            ADD 1 TO W-COUNT(IDX)
            MOVE "Y" TO FOUND-FLAG
            EXIT PERFORM
        END-IF
    END-PERFORM
    IF FOUND-FLAG = "N" AND SLOT-USED < 12
        ADD 1 TO SLOT-USED
        MOVE CUR-WORD TO W-TEXT(SLOT-USED)
        MOVE 1 TO W-COUNT(SLOT-USED)
    END-IF.

How it works

  1. UNSTRING ... WITH POINTER walks the passage one word at a time.
  2. TALLY-WORD bumps a known word or claims the next free table slot.
  3. MOVE ALL "#" into a sliced receiver draws each word's bar.

Keywords and builtins used here

The run, in numbers

Lines
53
Characters to type
1477
Tokens
223
Three-star pace
40 tpm

At the three-star pace of 40 tokens a minute, this run takes about 334 seconds.

Type this snippet

Step 1 of 3 in Encore, step 25 of 27 in Language basics.

← Previous Next →