COBOLでFizzBuzzプログラムを作る

FIZZBUZZ問題解説

プログラミング問題でよく出題される、FizzBuzz問題についてCOBOLで解く方法について解説します。
今回は2つの例を紹介しています。コード例1とコード例2では実装方法が少し異なりますので、どこが違うのか、自分だったらどのように作成するのかを考えながらみてください。

問題

1から100までの数値を画面に表示させる。
ただし、3の倍数の時には、数字の代わりに「FIZZ」と出力させ、5の倍数の時には、数字の代わりに「BUZZ」を出力させ、15の倍数の時には「FIZZBUZZ」と出力させるプログラムを作成しなさい。

解答コード例1

IDENTIFICATION DIVISION.
PROGRAM-ID. FIZZBUZZ.

DATA DIVISION.
    WORKING-STORAGE SECTION.
        
        *> I変数は1〜100までをカウントする、初期値は1
        01 I PIC 999 VALUES 1.
        
        *> 計算結果の余りを格納する変数
        01 RES-15 PIC 99.
        01 RES-3 PIC 9.
        01 RES-5 PIC 9.
        
PROCEDURE DIVISION.
    MAIN SECTION.

        *> I変数の初期化
        MOVE 1 TO I.

        *> 100回繰り返し処理
        PERFORM 100 TIMES
        
        *> 15で割ったあまりを求める
            COMPUTE RES-15 = FUNCTION MOD(I 15)
        *> 3で割った余りを求める
            COMPUTE RES-3 = FUNCTION MOD(I 3)
        *> 5で割った余りを求める
            COMPUTE RES-5 = FUNCTION MOD(I 5)

            *> 15で割った余りが0の時「FIZZBUZZ」を表示する
            IF RES-15 = 0 THEN
                DISPLAY "FIZZBUZZ"
            
            *> 3で割った余りが0の時「FIZZ」を表示する  
            ELSE IF RES-3 = 0 THEN
                DISPLAY "FIZZ"
               
            *> 5で割った余りが0の時「BUZZ」を表示する
            ELSE IF RES-5 = 0 THEN
                DISPLAY "BUZZ"
                
            *> 15、3、5、の倍数でない時は数字を表示する
            ELSE
                DISPLAY I
            END-IF
            END-IF
            END-IF
            
        *> I変数に1加算
            ADD 1 TO I
        
        END-PERFORM.

    STOP RUN.

コード例1の解説

FIZZBUZZ問題を解くためには、
①繰り返し同じ処理を100回行う
②3、5、15で割った場合の余を求める
③余りがない場合は3or5or15の倍数である
④どの場合に該当するのかIF文で確認し、条件に該当する出力をする
以上の段階を経て愚直にプログラムを作成したのが、コード例1となります。

コード例2

上記で挙げているコードは、やや冗長になっている箇所がありますので、よりスマートにしてみましょう。

IDENTIFICATION DIVISION.
PROGRAM-ID. FIZZBUZZ.

DATA DIVISION.
    WORKING-STORAGE SECTION.

        *> I変数は初期値1
        01 I PIC 9(3) VALUE 1.
        01 REM-3 PIC 9(2) VALUE 0.
        01 REM-5 PIC 9(2) VALUE 0.

PROCEDURE DIVISION.
    MAIN-SECTION.

        *> I変数が100より大きくなるまで繰り返す
        *> VARYINGでI変数に数値を1ずつ加算させて変動させる
        PERFORM VARYING I FROM 1 BY 1 UNTIL I > 100
            
            *> あまりを求める
            COMPUTE REM-3 = FUNCTION REM(I, 3)
            COMPUTE REM-5 = FUNCTION REM(I, 5)

            *> あまりの数値に応じて標準出力を変える
            IF REM-3 = 0 AND REM-5 = 0
                DISPLAY "FizzBuzz"
            ELSE IF REM-3 = 0
                DISPLAY "Fizz"
            ELSE IF REM-5 = 0
                DISPLAY "Buzz"
            ELSE
                DISPLAY I
            END-IF

        END-PERFORM.
STOP RUN.

コード例2の解説

まず変数の定義では、I変数を定義する際に初期値1も一緒に定義しています。そのため、コード例1とは異なりMAIN-SECTION内でI変数の初期化を行っていません。

PERFORM文ではVARYINGを使用することで、I変数が1ずつ加算されるようにしています。

あまりを求めるのはコード例1と同じですが、コード例2では3で割った余りと、5で割った余りのみ計算しています。
15で割ったあまりがゼロになるのか確認する方法としては、AND条件を使用して判別しています。

まとめ

以上がCOBOLでFizzBuzz問題を解く方法となります。他にも様々な方法があるのでご自身でも考えてみてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA