2010-11-15

「あみだくじ」 by COBOL

少し前の記事に「 あみだくじ 」があったと思います。そこで、僕はこう書きました。

COBOL 版はその同級生のブログに後々掲載されるハズです。

しかし、彼はなかなか動きませんでした。

COBOL では書きにくいプログラムなのかもしれません。 ということで、今朝より、COBOLにてこのプログラムを書こうと試行錯誤を続けた上で、やっと今完成しました。

なお、OpenCOBOLでコンパイルする際、自由形式にするため

cobc -x -free amida.cbl

のように、freeオプションをつけました。 これにより行頭にスペースを取る必要がなくなるようです。

まあ何はともあれソースコードをご覧ください。

IDENTIFICATION  DIVISION.
PROGRAM-ID. AMIDA.
AUTHOR.     YANTENE.

ENVIRONMENT DIVISION.
INPUT-OUTPUT    SECTION.
FILE-CONTROL.
    SELECT AMIDA-IN ASSIGN TO "./nyu.txt" ORGANIZATION IS LINE SEQUENTIAL.

DATA        DIVISION.
FILE        SECTION.
FD  AMIDA-IN.
01  YOMI-T.
    02  YOMI  OCCURS  9  PIC  X(01).
WORKING-STORAGE SECTION.
01  NAME-T.
    02  NAME  OCCURS  9  PIC  X(01)  VALUE SPACE.
01  STICK-T.
    02  STICK  OCCURS  9  PIC  X(01)  VALUE SPACE.
01  TEMP  PIC  X(01).
01  I     PIC  9(02).
01  FLG   PIC  9(01)  VALUE  0.

PROCEDURE   DIVISION.
    OPEN  INPUT  AMIDA-IN
    READ  AMIDA-IN
        NOT AT END
        PERFORM  VARYING  I  FROM  1  BY  2  UNTIL  I > 9
            MOVE YOMI(I) TO NAME(I)
        END-PERFORM
        DISPLAY  NAME-T
    END-READ
    PERFORM  UNTIL  FLG = 1
        READ    AMIDA-IN
            AT END      MOVE  1  TO  FLG
            NOT AT END  PERFORM  VARYING  I  FROM  2  BY  2  UNTIL  I > 8
                        MOVE  YOMI-T  TO  STICK-T
                        IF  STICK(I) = "-"
                            THEN  MOVE  NAME(I - 1) TO TEMP
                                  MOVE  NAME(I + 1) TO NAME(I - 1)
                                  MOVE  TEMP TO NAME(I + 1)
                        END-IF
                    END-PERFORM
                    DISPLAY  STICK-T
        END-READ
    END-PERFORM
    DISPLAY  NAME-T
    CLOSE  AMIDA-IN
    STOP  RUN.

なお、予め、この実行ファイルの同階層にnyu.txtが置かれ、 それにあみだくじの情報が書かれているものとします。

長いので難しいプログラムだったのではないか、 と思うかもしれませんが、そうでもありませんでした。

  • ① 実行ファイルと同階層にある「nyu.txt」に入ってる入力データ(あみだくじデータ)を開いておく。
  • ② まず、1行目(A〜Eの名前)を読み込み、NAME-T配列に入れ、内容を表示する。
  • ③ PERFORMで2行目以降を読み込み、STICK-T配列に入れ、偶数「I」番目に”-”がある場合はNAME-T配列の「I-1」番目と「I+1」番目を入れ替える。そしてSTICK-Tを表示する。これを、読み込みきるまで続ける。
  • ④ 整列済みのNAME-T配列を表示し、ファイルを閉じる。

これで完了です。

ただ、やっぱりめんどくさいですね…。