word_freq.cob en COBOL
Una tabla de frecuencia de palabras hecha de UNSTRING, búsqueda lineal y un gráfico de numerales.
*> 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.
Cómo funciona
UNSTRING ... WITH POINTERrecorre el pasaje palabra por palabra.TALLY-WORDsuma a una palabra conocida o reclama la siguiente casilla libre.MOVE ALL "#"hacia un receptor rebanado dibuja la barra de cada palabra.
Palabras clave y builtins usados aquí
ADDDATADISPLAYDIVISIONEXITIDENTIFICATIONIFMOVEPERFORMPROCEDURESECTIONSTOPUNSTRING
El intento, en números
- Líneas
- 53
- Caracteres a escribir
- 1477
- Tokens
- 223
- Ritmo de tres estrellas
- 40 tpm
Al ritmo de tres estrellas de 40 tokens por minuto, este intento toma unos 334 segundos.
Paso 1 de 3 en Bis; paso 25 de 27 en Fundamentos del lenguaje.