事前準備について
前回作成した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-NUM1とWS-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-TOTALがPIC 9(4)であるため、合計が150でも0150と4桁で表示される点も、桁数をあらかじめ固定するCOBOLらしいところ。
まとめ
- COBOLの変数は
WORKING-STORAGE SECTIONで、PIC句を使って桁数とともに宣言する PIC X(n)は文字列、PIC 9(n)は数値を表すACCEPTで入力を受け取り、DISPLAYで出力するADD ... TO ... GIVING ...で計算結果を別の変数に格納できる
次回は、IF文による条件分岐と、PERFORMによる繰り返し処理を扱う。
リポジトリ
- Rocky-Seven/cobol-learning –
00_02_variables-and-io/


コメント