新人SEのためのCOBOL入門 第3回:条件分岐と繰り返し(IF・PERFORM)

スポンサーリンク
COBOL

事前準備について

前回作成したCodespaceを再開(Resume)しているだけであれば、GnuCOBOLはインストール済みなのでそのまま進めてよい。
codespaceを新規作成、またはリビルドした場合は、以下を実行しよう。

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y gnucobol4

前回のおさらい

第2回では、WORKING-STORAGE SECTIONとPIC句で変数を宣言し、ACCEPTで入力を受け取り、ADDで計算する流れを扱った。今回はいよいよ、プログラムに「判断」と「繰り返し」を持たせよう。

繰り返し処理:PERFORM

COBOLで繰り返し処理を書くにはPERFORM文を使う。今回使うのは、指定した回数だけ処理を繰り返すPERFORM VARYINGという書き方である。

PERFORM VARYING WS-COUNT FROM 1 BY 1 UNTIL WS-COUNT > 5
    DISPLAY WS-COUNT "回目の金額を入力してください:"
    ACCEPT WS-INPUT
    ADD WS-INPUT TO WS-TOTAL
END-PERFORM.

これは「WS-COUNTを1から始め、1ずつ増やしながら、5を超えるまで繰り返す」という意味である。他の言語のfor文に近い。END-PERFORMで繰り返し範囲の終わりを明示している点もCOBOLらしい書き方である。

DISPLAYで複数の値をつなげる

DISPLAY WS-COUNT "回目の金額を入力してください:"のように、DISPLAYは複数の値を空白区切りで並べて書くことができる。並べた値は、変数であれ文字列リテラルであれ、そのまま連結されて1行に出力される。実は第2回のDISPLAY "合計は " WS-TOTAL " である。"でもすでにこの書き方を使っていたが、ここで改めて触れておく。変数の間に空白や句読点を挟みたい場合は、" "のような空白だけのリテラルを間に挟めばよい。

ACCEPTで数値項目に入力を受け取るときの注意

ACCEPT WS-INPUTのように、PIC 9(n)で宣言した数値項目に対してACCEPTを使うと、キーボードから入力された内容が数値としてその項目に格納される。ここには2つの落とし穴がある。

  • 桁数を超える入力をすると、上位の桁が黙って切り捨てられる
    WS-INPUTPIC 9(5)なので0〜99999までしか入らない。ここに123456と入力すると、エラーにはならず、上位の1が消えて23456として扱われてしまう。文字列項目(PIC X(n))が右側の文字を切り捨てるのとは逆で、数値項目は左側(上位の桁)が切り捨てられる点に注意したい。
  • 数字以外の文字を入力すると、意図しない値になる
    マイナス記号や小数点、全角数字などを入力すると、期待した数値にならなかったり、実行時エラーになったりする。
    今回は入力チェックを省略しているが、実務のプログラムでは入力値を検証する処理が必要になる。

条件分岐:IF

条件によって処理を分けるにはIF文を使う。

IF WS-TOTAL > WS-THRESHOLD
    DISPLAY "しきい値(" WS-THRESHOLD ")を超えている。"
ELSE
    DISPLAY "しきい値(" WS-THRESHOLD ")以内である。"
END-IF.

PERFORMと同様、IFの範囲もEND-IFで明示的に閉じる。COBOLでは「どこからどこまでが1つの処理のまとまりか」を、こうしたEND-〜で終わりまではっきり書く場面が多い。

プログラム全体

       IDENTIFICATION DIVISION.
       PROGRAM-ID. CONDITIONS-AND-LOOPS.
       AUTHOR. Rocky-Seven.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
      *>     繰り返し回数を数えるカウンタ(0で初期化)
       01 WS-COUNT        PIC 9(2)  VALUE 0.
      *>     1回ごとに入力される金額
       01 WS-INPUT        PIC 9(5).
      *>     5回分の合計金額(0で初期化)
       01 WS-TOTAL        PIC 9(6) VALUE 0.
      *>     判定に使うしきい値
       01 WS-THRESHOLD    PIC 9(6) VALUE 10000.

       PROCEDURE DIVISION.
       MAIN-PROCEDURE.
           DISPLAY "5回、入力を受け付けて合計を計算する。".

      *>     WS-COUNTを1から5まで1ずつ増やしながら入力・加算を繰り返す
           PERFORM VARYING WS-COUNT FROM 1 BY 1 UNTIL WS-COUNT > 5
               DISPLAY WS-COUNT "回目の金額を入力してください:"
               ACCEPT WS-INPUT
               ADD WS-INPUT TO WS-TOTAL
           END-PERFORM.

           DISPLAY "合計金額は " WS-TOTAL " である。".

      *>     合計がしきい値を超えているかどうかを判定する
           IF WS-TOTAL > WS-THRESHOLD
               DISPLAY "しきい値(" WS-THRESHOLD ")を超えている。"
           ELSE
               DISPLAY "しきい値(" WS-THRESHOLD ")以内である。"
           END-IF.

           STOP RUN.

WS-COUNTWS-TOTALの宣言にVALUE 0を付けている点にも触れておく。
これは変数を宣言すると同時に初期値を与える書き方であり、初期化を忘れて意図しない値のまま計算を始める、という初歩的なミスを防ぐことができる。

コンパイルして実行しよう

cobc -x -free conditions_and_loops.cob
./conditions_and_loops

金額を5回入力すると、次のように表示される。

5回、入力を受け付けて合計を計算する。
01回目の金額を入力してください:
3000
02回目の金額を入力してください:
2500
03回目の金額を入力してください:
1800
04回目の金額を入力してください:
4200
05回目の金額を入力してください:
1000
合計金額は 012500 である。
しきい値(010000)を超えている。

012500010000のように先頭に0が入っているのは、前回で触れた「PIC句で桁数をあらかじめ固定する」仕様によるものである。
WS-TOTALPIC 9(6)なので、値が12500であっても6桁分として012500が表示される。

この連載のまとめ

これまで3回にわたって、COBOLの最小構成から、変数、入出力、条件分岐、繰り返しまでを扱ってきた。整理すると次のようになる。

  1. 第1回:環境構築、DIVISIONの最小構成、書式のお約束
  2. 第2回:変数の宣言(PIC句)、ACCEPT・DISPLAY、ADD
  3. 第3回:PERFORMによる繰り返し、IFによる条件分岐

ここまでの要素は、COBOLで書かれた業務プログラムの基本部品でもある。
次のステップとして、同じリポジトリにある01_bank-account-management/(銀行口座管理の模擬プログラム)を読んでみると、今回学んだ「入力を受け取り、計算し、条件で判定する」という流れが、より実務に近い形でどう組み合わされているかが見えてくるはずである。

リポジトリ

コメント

タイトルとURLをコピーしました