HiveBrain v1.2.0
Get Started
← Back to all entries
patternMinor

Fizzbuzz in COBOL, Verbose dinosaur style

Submitted by: @import:stackexchange-codereview··
0
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-

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

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.