鳳鳴は祖父の俳号

日記 メモ そんなの

MacOSX1.6.8にOpenCOBOL1.1をインストールする/COBOLでFizzBuzz

http://ideone.com/NWXzs
 MacOSX1.6.8 64bitカーネル、homebrewによるライブラリ追加支援にて、OpenCOBOL1.1をインストールした。
GnuCOBOL (formerly OpenCOBOL) download | SourceForge.net


open-cobol-1.1を用意。ディレクトリに移動。
./configure を実行するとエラーが出る。ライブラリが足らないのでhomebrewで追加する。


brew install gmp
brew install gettext
brew install libiconv
brew install db

もし足らなかったら、configure.logから判断して追加してください。
あとはmakeするだけ。
./cobc/cobc がOpenCOBOLコンパイラです。
使用例: -xオプションは実行形式を作ります。
./cobc/cobc -x fizzbuzz.cob ; ./fizzbuzz

不完全なFizzBuzzのソースリストはこちら:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. FIZZBUZZ.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 CT PIC 999 VALUE 1.
       01 FZ PIC 999 VALUE 1.
       01 BZ PIC 999 VALUE 1.
       PROCEDURE DIVISION.
       PERFORM 100 TIMES
         IF FZ = 3
            THEN IF BZ = 5
              THEN DISPLAY "FizzBuzz"
              COMPUTE BZ = 0
              ELSE DISPLAY "Fizz"
              END-IF
              COMPUTE FZ = 0
            ELSE IF BZ = 5
              THEN DISPLAY "Buzz"
              COMPUTE BZ = 0
              ELSE DISPLAY CT
              END-IF
          END-IF
         ADD 1 TO CT
         ADD 1 TO FZ
         ADD 1 TO BZ
       END-PERFORM
       STOP RUN.

ちゃんとできた。Anarchy Golfで確認済。anarchy golf - FizzBuzz

       IDENTIFICATION DIVISION.
       PROGRAM-ID. FIZZBUZZ.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 CT PIC 999 VALUE 1.
       01 CT2 PIC 99 VALUE 1.
       01 CT1 PIC 9 VALUE 1.
       01 FZ PIC 999 VALUE 1.
       01 BZ PIC 999 VALUE 1.
       PROCEDURE DIVISION.
       PERFORM 100 TIMES
         IF FZ = 3
            THEN IF BZ = 5
                 THEN DISPLAY "FizzBuzz"
                      MOVE 0 TO BZ
                 ELSE DISPLAY "Fizz"
                 END-IF
                 MOVE 0 TO FZ
            ELSE IF BZ = 5
                 THEN DISPLAY "Buzz"
                      MOVE 0 TO BZ
                 ELSE IF CT < 10
                      THEN MOVE CT TO CT1
                           DISPLAY CT1
                      ELSE IF CT < 100 
                           THEN MOVE CT TO CT2
                                DISPLAY CT2
                           ELSE DISPLAY CT
                           END-IF
                      END-IF
                 END-IF
          END-IF
         ADD 1 TO CT
         ADD 1 TO FZ
         ADD 1 TO BZ
       END-PERFORM
       STOP RUN.

 さらにEVALUATE文ですっきり。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. FIZZBUZZ.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 CT PIC 999 VALUE 1.
       01 CT2 PIC 99 VALUE 1.
       01 CT1 PIC 9 VALUE 1.
       01 FZ PIC 999 VALUE 1.
       01 BZ PIC 999 VALUE 1.
       PROCEDURE DIVISION.
       PERFORM 100 TIMES
         EVALUATE FZ ALSO BZ
           WHEN 3 ALSO 5   DISPLAY "FizzBuzz"
                           MOVE 0 TO FZ
                           MOVE 0 TO BZ
           WHEN 3 ALSO ANY DISPLAY "Fizz"
                           MOVE 0 TO FZ
           WHEN ANY ALSO 5 DISPLAY "Buzz"
                           MOVE 0 TO BZ
           WHEN OTHER EVALUATE CT
                        WHEN 1 THRU 9   MOVE CT TO CT1
                                        DISPLAY CT1
                        WHEN 10 THRU 99 MOVE CT TO CT2
                                        DISPLAY CT2
                        WHEN OTHER      DISPLAY CT
                      END-EVALUATE
         END-EVALUATE
         ADD 1 TO CT
         ADD 1 TO FZ
         ADD 1 TO BZ
       END-PERFORM
       STOP RUN.