patternMinor
Fizzbuzz in COBOL, Verbose dinosaur style
Viewed 0 times
dinosaurfizzbuzzstyleverbosecobol
Problem
I was long a professional in COBOL, but noone ever dared comment my style. As the FizzBuzz seems fashion here, I made one. Verbose, of course, we're speaking about COBOL. I know I could have made in 15 lines, but decided instead to provide the full structure for a production program. Result makes 87 lines.
I'll be happy to read your thoughts, comments, critics, or executions. Made on OpenCOBOLIDE.
```
Author:Gazzz0X2Z
Date:2015, Dec the 12th
Purpose:FizzBuzz, what else?
Tectonics: cobc
IDENTIFICATION DIVISION.
------------*-
PROGRAM-ID. FIZZBUZZ.
----------*--
ENVIRONMENT DIVISION.
----------*--
CONFIGURATION SECTION.
*----------------------
INPUT-OUTPUT SECTION.
*----------------------
DATA DIVISION.
--------
FILE SECTION.
*-------------------------
WORKING-STORAGE SECTION.
*-------------------------
01 WS-DATA.
05 WS-COUNTS.
10 WS-FIRST PIC 9(4) VALUE ZERO.
10 WS-LAST PIC 9(4) VALUE 20.
10 WS-POSN PIC 9(4).
05 WS-RESULTS.
10 WS-RS00 PIC 9(4).
10 WS-RM05 PIC 9(4).
88 WS-ML05 VALUE ZERO.
10 WS-RM03 PIC 9(4).
88 WS-ML03 VALUE ZERO.
05 WS-DISPLAY-STRING PIC X(10).
05 WS-DISPLAY-NUM REDEFINES WS-DISPLAY-STRING.
10 WS-FIZZBUZZ-PRI PIC X(3).
10 WS-FIZZBUZZ-INT PIC Z(3)9.
10 WS-FIZZBUZZ-SUI PIC X(3).
05 WS-DISPLAY-ALPHA REDEFINES WS-DISPLAY-STRING.
10 WS-FIZZBUZZ-STR PIC X(10).
88 WS-
I'll be happy to read your thoughts, comments, critics, or executions. Made on OpenCOBOLIDE.
```
Author:Gazzz0X2Z
Date:2015, Dec the 12th
Purpose:FizzBuzz, what else?
Tectonics: cobc
IDENTIFICATION DIVISION.
------------*-
PROGRAM-ID. FIZZBUZZ.
----------*--
ENVIRONMENT DIVISION.
----------*--
CONFIGURATION SECTION.
*----------------------
INPUT-OUTPUT SECTION.
*----------------------
DATA DIVISION.
--------
FILE SECTION.
*-------------------------
WORKING-STORAGE SECTION.
*-------------------------
01 WS-DATA.
05 WS-COUNTS.
10 WS-FIRST PIC 9(4) VALUE ZERO.
10 WS-LAST PIC 9(4) VALUE 20.
10 WS-POSN PIC 9(4).
05 WS-RESULTS.
10 WS-RS00 PIC 9(4).
10 WS-RM05 PIC 9(4).
88 WS-ML05 VALUE ZERO.
10 WS-RM03 PIC 9(4).
88 WS-ML03 VALUE ZERO.
05 WS-DISPLAY-STRING PIC X(10).
05 WS-DISPLAY-NUM REDEFINES WS-DISPLAY-STRING.
10 WS-FIZZBUZZ-PRI PIC X(3).
10 WS-FIZZBUZZ-INT PIC Z(3)9.
10 WS-FIZZBUZZ-SUI PIC X(3).
05 WS-DISPLAY-ALPHA REDEFINES WS-DISPLAY-STRING.
10 WS-FIZZBUZZ-STR PIC X(10).
88 WS-
Solution
As I'm sure you are aware, COBOL tends to be written one way at one site, another way at another.
Often things like name prefixes, and paragraph/SECTION prefixes cannot be other than dictated. Same with case of identifiers.
I dislike WSnn- (drives people nuts trying to insert numbers so that new data can be located rationally rather than in the order of arrival in specification) and WS- (similar for the LINKAGE SECTION) but am happy with W-/L-/LS- (or nothing). Absolutely hate single-word identifiers. Even these days with forewarning of what may appear later, it is plain dumb to have them there waiting for some compiler-change to make them invalid.
Also, since COBOL has no concept of "main", it is something to avoid pretending exists.
For paragraphs, or SECTIONS, I go with two numerics. Then with each subsequent level, append an alpha, A, D, G, J, M etc (allowing for insertions), and keep all related paragraphs/SECTIONS together, physically. Your program only has one level, so it doesn't really matter what you do in that one.
Nicely laid-out. I tend to be more extreme, but the effort you've invested impresses the reader (if they are a programmer, rather than a 9-5-er).
Hate the comments.
I'd remove all the redundant code (you don't need an ENVIRONMENT DIVISION, for instance).
Ah, for these last two, they have been generated for you, so I'd suggest copying an existing model program rather than using the OpenCOBOLIDE bolierplate.
I only use VARYING with things that, well, vary. So I'd use TIMES. Describe the situation better. You have to do more typing, but in addition to the better description of the data, your code will be faster than using VARYING.
Forget ideas like using REM. COBOL has done remainders since day one, a considerable time ago, so why (I don't know the answer to this) is there a function for it? In Enterprise COBOL (IBM Mainframe) REM would return a floating-point item, then converted to what you define in your program. Wow, do we need that?
I would work on the data-names a bit, but they are better than VAR1, VAR2 (or WS13-VAR1 and WS34-VAR2).
Here's an example of how I like to format a program:
http://ibmmainframes.com/viewtopic.php?p=278927#278927
And since that is a link, here's the code:
```
IDENTIFICATION DIVISION.
PROGRAM-ID. BBHEXD.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 W-WHEN-COMPILED PIC X(8)BX(8).
01 W-DISPLAY-HEX-MAX-UIND USAGE IS INDEX.
01 W-FIRST-TIME-FLAG PIC X VALUE "Y".
88 W-FIRST-TIME-IN-PROGRAM VALUE "Y".
88 W-NOT-FIRST-TIME-FLAG VALUE "N".
01 W-WORK-BYTE-FOR-CALC COMP PIC S9(4) VALUE ZERO.
01 FILLER REDEFINES W-WORK-BYTE-FOR-CALC.
05 FILLER PIC X.
05 W-WORK-BYTE PIC X.
01 W-LEFT-HALF-BYTE-NUM COMP PIC S9(4).
01 W-RIGHT-HALF-BYTE-NUM COMP PIC S9(4).
01 W-BYTES-TO-OUTPUT COMP PIC S9(4).
01 W-BYTES-MOVED COMP PIC S9(4).
01 W-HEX-ALPHA-SUB COMP PIC S9(4).
01 W-HEX-ALPHA-TABLE VALUE "ABCDEF".
05 FILLER OCCURS 6 TIMES
INDEXED BY W-HEX-ALPHA-IDX.
10 W-HEX-ALPHA PIC X.
01 W-DISPLAY-HEX.
05 W-LEFT-HEX PIC X.
05 W-RIGHT-HEX PIC X.
01 W-HEX-TO-DISPLAY-LEFT-TABLE VALUE SPACE.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-BYTES-TO-OUTPUT
INDEXED BY W-DISPLAY-HEX-LEFT-IND.
10 W-HEX-TO-DISPLAY-LEFT PIC X.
88 W-HEX-TO-DISPLAY-LEFT-IS-EMPTY
VALUE SPACE.
01 W-HEX-TO-DISPLAY-RIGHT-TABLE VALUE SPACE.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-BYTES-TO-OUTPUT
INDEXED BY W-DISPLAY-HEX-RIGHT-IND.
10 W-HEX-TO-DISPLAY-RIGHT PIC X.
01 W-BYTE-TO-DISPLAY-TABLE VALUE SPACE.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-BYTES-TO-OUTPUT
INDEXED BY W-DISPLAY-BYTE-IND.
10 W-BYTE-TO-DISPLAY PIC X.
01 W-CONVERT-TO-HEX-FROM-DIGIT COMP PIC S9(4).
01 W-CONVERTED-HEX-DIGIT PIC X.
01 W-CONVERTED-HEX-DIGIT-NUM
REDEFINES W-CONVERTED-HEX-DIGIT PIC 9.
01 W-CONVERTED-HEX-DIGIT-NUM4 PIC 9(4).
01 FILLER REDEFINES W-CONVERTED-HEX-DIGIT-NUM4.
05 FILLER PIC XXX.
05 W-CONVERTED-HEX-DIGIT-NUM4L PIC 9.
01 W-COLS-LINE.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-BYTES-TO-OUTPUT.
10 FILLER PIC X.
01 W-COLS-TABLE.
05 FILLER PIC X(10) VALUE
"----+----1".
05 FILLER PIC X(10) VALUE
"----+----2".
05 FILLE
Often things like name prefixes, and paragraph/SECTION prefixes cannot be other than dictated. Same with case of identifiers.
I dislike WSnn- (drives people nuts trying to insert numbers so that new data can be located rationally rather than in the order of arrival in specification) and WS- (similar for the LINKAGE SECTION) but am happy with W-/L-/LS- (or nothing). Absolutely hate single-word identifiers. Even these days with forewarning of what may appear later, it is plain dumb to have them there waiting for some compiler-change to make them invalid.
Also, since COBOL has no concept of "main", it is something to avoid pretending exists.
For paragraphs, or SECTIONS, I go with two numerics. Then with each subsequent level, append an alpha, A, D, G, J, M etc (allowing for insertions), and keep all related paragraphs/SECTIONS together, physically. Your program only has one level, so it doesn't really matter what you do in that one.
Nicely laid-out. I tend to be more extreme, but the effort you've invested impresses the reader (if they are a programmer, rather than a 9-5-er).
Hate the comments.
I'd remove all the redundant code (you don't need an ENVIRONMENT DIVISION, for instance).
Ah, for these last two, they have been generated for you, so I'd suggest copying an existing model program rather than using the OpenCOBOLIDE bolierplate.
I only use VARYING with things that, well, vary. So I'd use TIMES. Describe the situation better. You have to do more typing, but in addition to the better description of the data, your code will be faster than using VARYING.
Forget ideas like using REM. COBOL has done remainders since day one, a considerable time ago, so why (I don't know the answer to this) is there a function for it? In Enterprise COBOL (IBM Mainframe) REM would return a floating-point item, then converted to what you define in your program. Wow, do we need that?
I would work on the data-names a bit, but they are better than VAR1, VAR2 (or WS13-VAR1 and WS34-VAR2).
Here's an example of how I like to format a program:
http://ibmmainframes.com/viewtopic.php?p=278927#278927
And since that is a link, here's the code:
```
IDENTIFICATION DIVISION.
PROGRAM-ID. BBHEXD.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 W-WHEN-COMPILED PIC X(8)BX(8).
01 W-DISPLAY-HEX-MAX-UIND USAGE IS INDEX.
01 W-FIRST-TIME-FLAG PIC X VALUE "Y".
88 W-FIRST-TIME-IN-PROGRAM VALUE "Y".
88 W-NOT-FIRST-TIME-FLAG VALUE "N".
01 W-WORK-BYTE-FOR-CALC COMP PIC S9(4) VALUE ZERO.
01 FILLER REDEFINES W-WORK-BYTE-FOR-CALC.
05 FILLER PIC X.
05 W-WORK-BYTE PIC X.
01 W-LEFT-HALF-BYTE-NUM COMP PIC S9(4).
01 W-RIGHT-HALF-BYTE-NUM COMP PIC S9(4).
01 W-BYTES-TO-OUTPUT COMP PIC S9(4).
01 W-BYTES-MOVED COMP PIC S9(4).
01 W-HEX-ALPHA-SUB COMP PIC S9(4).
01 W-HEX-ALPHA-TABLE VALUE "ABCDEF".
05 FILLER OCCURS 6 TIMES
INDEXED BY W-HEX-ALPHA-IDX.
10 W-HEX-ALPHA PIC X.
01 W-DISPLAY-HEX.
05 W-LEFT-HEX PIC X.
05 W-RIGHT-HEX PIC X.
01 W-HEX-TO-DISPLAY-LEFT-TABLE VALUE SPACE.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-BYTES-TO-OUTPUT
INDEXED BY W-DISPLAY-HEX-LEFT-IND.
10 W-HEX-TO-DISPLAY-LEFT PIC X.
88 W-HEX-TO-DISPLAY-LEFT-IS-EMPTY
VALUE SPACE.
01 W-HEX-TO-DISPLAY-RIGHT-TABLE VALUE SPACE.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-BYTES-TO-OUTPUT
INDEXED BY W-DISPLAY-HEX-RIGHT-IND.
10 W-HEX-TO-DISPLAY-RIGHT PIC X.
01 W-BYTE-TO-DISPLAY-TABLE VALUE SPACE.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-BYTES-TO-OUTPUT
INDEXED BY W-DISPLAY-BYTE-IND.
10 W-BYTE-TO-DISPLAY PIC X.
01 W-CONVERT-TO-HEX-FROM-DIGIT COMP PIC S9(4).
01 W-CONVERTED-HEX-DIGIT PIC X.
01 W-CONVERTED-HEX-DIGIT-NUM
REDEFINES W-CONVERTED-HEX-DIGIT PIC 9.
01 W-CONVERTED-HEX-DIGIT-NUM4 PIC 9(4).
01 FILLER REDEFINES W-CONVERTED-HEX-DIGIT-NUM4.
05 FILLER PIC XXX.
05 W-CONVERTED-HEX-DIGIT-NUM4L PIC 9.
01 W-COLS-LINE.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-BYTES-TO-OUTPUT.
10 FILLER PIC X.
01 W-COLS-TABLE.
05 FILLER PIC X(10) VALUE
"----+----1".
05 FILLER PIC X(10) VALUE
"----+----2".
05 FILLE
Code Snippets
IDENTIFICATION DIVISION.
PROGRAM-ID. BBHEXD.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 W-WHEN-COMPILED PIC X(8)BX(8).
01 W-DISPLAY-HEX-MAX-UIND USAGE IS INDEX.
01 W-FIRST-TIME-FLAG PIC X VALUE "Y".
88 W-FIRST-TIME-IN-PROGRAM VALUE "Y".
88 W-NOT-FIRST-TIME-FLAG VALUE "N".
01 W-WORK-BYTE-FOR-CALC COMP PIC S9(4) VALUE ZERO.
01 FILLER REDEFINES W-WORK-BYTE-FOR-CALC.
05 FILLER PIC X.
05 W-WORK-BYTE PIC X.
01 W-LEFT-HALF-BYTE-NUM COMP PIC S9(4).
01 W-RIGHT-HALF-BYTE-NUM COMP PIC S9(4).
01 W-BYTES-TO-OUTPUT COMP PIC S9(4).
01 W-BYTES-MOVED COMP PIC S9(4).
01 W-HEX-ALPHA-SUB COMP PIC S9(4).
01 W-HEX-ALPHA-TABLE VALUE "ABCDEF".
05 FILLER OCCURS 6 TIMES
INDEXED BY W-HEX-ALPHA-IDX.
10 W-HEX-ALPHA PIC X.
01 W-DISPLAY-HEX.
05 W-LEFT-HEX PIC X.
05 W-RIGHT-HEX PIC X.
01 W-HEX-TO-DISPLAY-LEFT-TABLE VALUE SPACE.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-BYTES-TO-OUTPUT
INDEXED BY W-DISPLAY-HEX-LEFT-IND.
10 W-HEX-TO-DISPLAY-LEFT PIC X.
88 W-HEX-TO-DISPLAY-LEFT-IS-EMPTY
VALUE SPACE.
01 W-HEX-TO-DISPLAY-RIGHT-TABLE VALUE SPACE.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-BYTES-TO-OUTPUT
INDEXED BY W-DISPLAY-HEX-RIGHT-IND.
10 W-HEX-TO-DISPLAY-RIGHT PIC X.
01 W-BYTE-TO-DISPLAY-TABLE VALUE SPACE.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-BYTES-TO-OUTPUT
INDEXED BY W-DISPLAY-BYTE-IND.
10 W-BYTE-TO-DISPLAY PIC X.
01 W-CONVERT-TO-HEX-FROM-DIGIT COMP PIC S9(4).
01 W-CONVERTED-HEX-DIGIT PIC X.
01 W-CONVERTED-HEX-DIGIT-NUM
REDEFINES W-CONVERTED-HEX-DIGIT PIC 9.
01 W-CONVERTED-HEX-DIGIT-NUM4 PIC 9(4).
01 FILLER REDEFINES W-CONVERTED-HEX-DIGIT-NUM4.
05 FILLER PIC XXX.
05 W-CONVERTED-HEX-DIGIT-NUM4L PIC 9.
01 W-COLS-LINE.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-BYTES-TO-OUTPUT.
10 FILLER PIC X.
01 W-COLS-TABLE.
05 FILLER PIC X(10) VALUE
"----+----1".
05 FILLER PIC X(10) VALUE
"----+----2".
05 FILLER PIC X(10) VALUE
"----+----3".
05 FILLER PIC X(10) VALUE
"----+----4".
05 FILLER PIC X(10) VALUE
"----+----5".
05 FILLER IDENTIFICATION DIVISION.
PROGRAM-ID. UGLY.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 W-A PIC X(8)BX(8).
01 W-B USAGE IS INDEX.
01 W-C USAGE IS INDEX.
01 W-D PIC S9(9).
01 FILLER REDEFINES W-D.
05 FILLER PIC X(5).
05 W-E PIC 9(4).
01 W-F PIC X VALUE "Y".
88 W-F-Y VALUE "Y".
88 W-F-N VALUE "N".
01 W-G COMP PIC S9(4) VALUE ZERO.
01 FILLER REDEFINES W-G.
05 FILLER PIC X.
05 W-H PIC X.
01 W-I COMP PIC S9(4).
01 W-J COMP PIC S9(4).
01 W-K COMP PIC S9(4).
01 W-L COMP PIC S9(4).
01 W-M VALUE "ABCDEF".
05 FILLER OCCURS 6 TIMES
INDEXED BY I.
10 W-N PIC X.
01 W-O.
05 W-P PIC X.
05 W-Q PIC X.
01 W-R.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-K
INDEXED BY J.
10 W-S PIC X.
88 W-S-Y
VALUE SPACE.
01 W-T.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-K
INDEXED BY K.
10 W-U PIC X.
01 W-V.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-K
INDEXED BY L.
10 W-W PIC X.
01 W-X COMP PIC S9(4).
01 W-Y PIC X.
01 W-Z
REDEFINES W-Y PIC 9.
01 W-AA PIC 9(4).
01 FILLER REDEFINES W-AA.
05 FILLER PIC XXX.
05 W-AB PIC 9.
01 W-AC.
05 FILLER OCCURS 1 TO 132 TIMES
DEPENDING ON W-K.
10 FILLER PIC X.
01 W-AD.
05 FILLER PIC X(10) VALUE
"----+----1".
05 FILLER PIC X(10) VALUE
"----+----2".
05 FILLER PIC X(10) VALUE
"----+----3".
05 FILLER PIC X(10) VALUE
"----+----4".
05 FILLER PIC X(10) VALUE
"----+----5".
05 FILLER PIC X(10) VALUE
"----+----6".
05 FILLER PIC X(10) VALUE
"----+----7".
05 FILLER PIC X(10) VALUE
"----+----8".
05 FILLER PIC X(10) VALUE
"----+----9".
05 FILLER PIC X(10) VALUE
"----+----0".
05 FILLER PIC X(10) VALUE
"----+----1".
05 FILLER PIC X(10) VALUE
"----+----2".
05 FILLER Context
StackExchange Code Review Q#112880, answer score: 4
Revisions (0)
No revisions yet.