新人SEのためのCOBOL入門 第2回:変数とデータの型(PIC句・ACCEPT)

スポンサーリンク
COBOL
事前準備について
前回作成したcodespaceを再開(Resume)している場合、GnuCOBOLはインストール済みとして進めてよい。
codespaceを新規作成、またはリビルドした場合は、以下を実行しよう。

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

前回のおさらい

第1回では、GitHub Codespacesで環境を用意し、DISPLAYで文字を表示するだけのプログラムを動かした。COBOLの書式(固定形式・自由形式)とコメントの書き方にも触れた。

今回は、プログラムに「データを持たせる」ための変数と、キーボードからの入力を扱う。

COBOLの変数は「型」より先に「桁数」を決める

Python や JavaScript の変数は、代入した値によって型が決まる。一方COBOLでは、変数を使う前にどんなデータを、何桁まで格納するかを宣言しておく必要がある。この宣言を行う場所が WORKING-STORAGE SECTION であり、桁数や種類を指定する書き方が PIC句 である。

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-NAME        PIC X(20).
       01 WS-NUM1        PIC 9(3).
       01 WS-NUM2        PIC 9(3).
       01 WS-TOTAL       PIC 9(4). 

まずは次の2種類を覚えておこう。

書き方意味
PIC X(20)半角20文字までの文字列を格納する領域
PIC 9(3)0〜999までの数値を格納する領域(3桁)

Xは文字(Alphanumeric)、9は数字(Numeric)を表し、カッコの中の数字が桁数である。PIC 9(3)であれば999までしか入らない。計算結果などが定義した桁数を超える場合は、サイズエラーや値の格納方法に注意する必要がある。
この「桁数を最初に決める」という感覚が、COBOLらしさの一つである。

キーボードからの入力を受け取る:ACCEPT

入力を受け取るにはACCEPT文を使う。

DISPLAY "名前を入力してください:".
ACCEPT WS-NAME.
DISPLAY "こんにちは、" WS-NAME " さん。".

流れとしては、DISPLAYで入力を促すメッセージを表示し、ACCEPTで入力された値を変数に格納し、その変数を再びDISPLAYで表示する、という組み合わせである。

数値を計算する:ADD

数値同士の計算にはADD文を使う。

ADD WS-NUM1 TO WS-NUM2 GIVING WS-TOTAL.

これは「WS-NUM1WS-NUM2を足して、結果をWS-TOTALに入れる」という意味である。
GIVINGを使わずにADD WS-NUM1 TO WS-NUM2と書くと、WS-NUM2自体が上書きされる点に注意が必要である。今回は結果を別の変数に残したいためGIVINGを使っている。

プログラム全体

コンパイル時は第1回と同じく-freeオプションを付けよう。
本連載では、ファイル内に宣言を書く方式ではなく、コンパイルコマンド側で自由形式を指定する運用に統一している。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. VARIABLES-AND-IO.
       AUTHOR. Rocky-Seven.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
      *>     名前を格納する領域(半角20文字まで)
       01 WS-NAME        PIC X(20).
      *>     入力された数値を格納する領域(0〜999)
       01 WS-NUM1        PIC 9(3).
       01 WS-NUM2        PIC 9(3).
      *>     2つの数値の合計を格納する領域(桁あふれを避けるため1桁多くとる)
       01 WS-TOTAL       PIC 9(4).

       PROCEDURE DIVISION.
       MAIN-PROCEDURE.
      *>     名前の入力と挨拶の表示
           DISPLAY "名前を入力してください:".
           ACCEPT WS-NAME.
           DISPLAY "こんにちは、" WS-NAME " さん。".

      *>     計算に使う2つの数値を入力してもらう
           DISPLAY "1つ目の数値(3桁まで)を入力してください:".
           ACCEPT WS-NUM1.
           DISPLAY "2つ目の数値(3桁まで)を入力してください:".
           ACCEPT WS-NUM2.

      *>     合計を計算し、結果を表示する
           ADD WS-NUM1 TO WS-NUM2 GIVING WS-TOTAL.
           DISPLAY "合計は " WS-TOTAL " である。".

           STOP RUN.

第1回にはなかったDATA DIVISIONが追加されている点に注意したい。COBOLでは「どんなデータを使うか」をDATA DIVISIONで宣言し、「そのデータをどう処理するか」をPROCEDURE DIVISIONに書く、という役割分担がはっきりしている。

コンパイルして実行する

cobc -x -free variables.cob
./variables

名前と数値を2つ入力すると、次のように表示される。

名前を入力してください:
Rocky
こんにちは、Rocky さん。
1つ目の数値(3桁まで)を入力してください:
120
2つ目の数値(3桁まで)を入力してください:
30
合計は 0150 である。

WS-TOTALPIC 9(4)であるため、合計が150でも0150と4桁で表示される点も、桁数をあらかじめ固定するCOBOLらしいところ。

まとめ

  • COBOLの変数はWORKING-STORAGE SECTIONで、PIC句を使って桁数とともに宣言する
  • PIC X(n)は文字列、PIC 9(n)は数値を表す
  • ACCEPTで入力を受け取り、DISPLAYで出力する
  • ADD ... TO ... GIVING ...で計算結果を別の変数に格納できる

次回は、IF文による条件分岐と、PERFORMによる繰り返し処理を扱う。

リポジトリ

コメント

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