プログラミング問題でよく出題される、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問題を解く方法となります。他にも様々な方法があるのでご自身でも考えてみてください。