FizzBuzz

COBOLの練習にFizzBuzzを書いてみた。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. FizzBuzz.
       
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 CNT PIC 9(03) VALUE 0.
       01 MOD PIC 9(01) VALUE 0.
       01 TMP PIC 9(01) VALUE 0.
       01 FIZ PIC X(05) VALUE "".
       01 BUZ PIC X(05) VALUE "".
       01 STR PIC X(08) VALUE "".
       
       PROCEDURE DIVISION.
       PERFORM VARYING CNT FROM 1 BY 1 UNTIL CNT > 100
         DIVIDE CNT BY 3 GIVING TMP REMAINDER MOD
         IF MOD = 0
           THEN MOVE "Fizz#" TO FIZ
           ELSE MOVE "#" TO FIZ
         END-IF
         DIVIDE CNT BY 5 GIVING TMP REMAINDER MOD
         IF MOD = 0
           THEN MOVE "Buzz#" TO BUZ
           ELSE MOVE "#" TO BUZ
         END-IF
         MOVE "" TO STR
         STRING FIZ BUZ DELIMITED BY "#" INTO STR
         IF STR = ""
           THEN DISPLAY CNT
           ELSE DISPLAY STR
         END-IF
       END-PERFORM
       STOP RUN.

おぼえがき

変数宣言中の9(03)は数値型(=9)で3桁分確保、X(05)は文字型(=X)で5桁分確保という意味。
変数の代入にはMOVEを使い、=は同値判定に使う。
剰余計算は割り算の命令のオプション機能(REMAINDER)で求めた。
各変数FIZ,BUZについて#が来るまでをSTRにコピーする機能(DELIMITED BY)を文字列結合の代わりに使った。

とりあえずこれでCOBOLは大体わかった、ということにしてしまおう(笑)

止揚流プログラム講座(COBOL編)

http://hp.vector.co.jp/authors/VA003991/kouza/beginner/kouza_cobol.html

言語別対応表
ASM BASIC C C++ COBOL Perl

http://hp.vector.co.jp/authors/VA003991/kouza/beginner/kouza_omake.html

比較表もあり、概要レベルとしてのまとめかたがいい感じ