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
UNSTRING ... WITH POINTERwalks the passage one word at a time.TALLY-WORDbumps a known word or claims the next free table slot.MOVE ALL "#"into a sliced receiver draws each word's bar.
Keywords and builtins used here
ADDDATADISPLAYDIVISIONEXITIDENTIFICATIONIFMOVEPERFORMPROCEDURESECTIONSTOPUNSTRING
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.
Step 1 of 3 in Encore, step 25 of 27 in Language basics.