プログラムを書いていると、「あー、ここ、さっきと同じ処理だ…また書くの面倒だな…」とか、「この処理を10回繰り返したいんだけど、どうすればいいの?」なんて思うこと、ありますよね?
- PERFORM文が何をする命令なのか、基本がわかる
- 決まった回数だけ繰り返す方法(TIMES)が身につく
- ある条件になるまで繰り返す方法(UNTIL)が使えるようになる
- カウンターを活用して繰り返す方法(VARYING)を習得できる
- PERFORM文を使うときの、ありがちな失敗と対策がわかる
COBOL PERFORM文とは?プログラムの流れを制御する基本
COBOLの「PERFORM文」とは一体何者なんでしょう?
簡単に言うと、プログラムの中の「特定の処理のまとまり(段落やセクションと呼ばれます)を実行してきて!」と命令するための言葉です。
料理で例えるなら、「手順5の『野菜を炒める』をやって!」みたいに、別の場所に書いてある処理を呼び出すイメージですね。
これができると、2つの大きなメリットがあります。
- 同じような処理を何度も書かなくて済む!(プログラムがスッキリ!)
- 決まった回数や、ある条件になるまで、同じ処理を繰り返せる!
プログラムの流れを自由自在に操るための、基本的な命令の一つなんです。これを使わない手はないでしょう?
COBOL PERFORM文の基本的な書き方(構文ルール)
じゃあ、どうやって書くの?って話ですよね。一番シンプルなPERFORM文の書き方はこうです。
PERFORM 段落名.
たったこれだけ!シンプル!
構成要素を見てみましょう。
- PERFORM
- 「これから指定する処理を実行せよ!」という命令のキーワード。
- 段落名
- 実行してほしい処理が書いてある場所(段落)の名前。自分で好きな名前を付けられます(例:SYORI-A、DATA-CHECKなど)。プログラムのPROCEDURE DIVISIONに `段落名.` という形で定義しておきます。
- .(ピリオド)
- 文の終わりを示す記号。COBOLではお約束ですね。忘れずに付けましょう。
セクションという、段落より大きなまとまりを実行する場合も `PERFORM セクション名.` と書けます。
まずは「PERFORM 処理の名前.」この形をしっかり覚えちゃいましょう!
COBOL PERFORM文の使い方①:決まった回数繰り返す(TIMES指定)
「この処理、ちょうど5回繰り返したいんだよなー」そんなときに便利なのが `TIMES` オプションです!
名前の通り、指定した回数だけ、きっちり処理を繰り返してくれます。律儀なやつですね。
例えば、画面に挨拶を3回表示するとか、特定の初期設定を10回行うとか、そんな場面で活躍しますよ。
TIMES指定の書き方
書き方は、基本形に回数を付け加えるだけ。
PERFORM 段落名 回数 TIMES.
「回数」の部分には、
- 直接数字を書く(例:`3 TIMES`)
- 回数が入ったデータ項目(変数)を指定する(例:`WS-COUNT TIMES`)
TIMES指定を使ったサンプルプログラム
百聞は一見にしかず!簡単なサンプルプログラムを見てみましょう。
「HELLO COBOL!」というメッセージを3回表示するプログラムです。
IDENTIFICATION DIVISION. PROGRAM-ID. PERFORM-TIMES-SAMPLE. DATA DIVISION. WORKING-STORAGE SECTION. *> 特に作業領域は使わない PROCEDURE DIVISION. MAIN-PROCEDURE. DISPLAY "TIMES指定の実行開始". PERFORM DISPLAY-MESSAGE 3 TIMES. *> DISPLAY-MESSAGE段落を3回実行 DISPLAY "TIMES指定の実行終了". STOP RUN. DISPLAY-MESSAGE. *> ここが実行される段落 DISPLAY "HELLO COBOL!".
実行結果はこうなります。
TIMES指定の実行開始 HELLO COBOL! HELLO COBOL! HELLO COBOL! TIMES指定の実行終了
ちゃんと3回表示されましたね!簡単でしょう?
COBOL PERFORM文の使い方②:条件を満たすまで繰り返す(UNTIL指定)
今度は、「何回繰り返すかは分からないけど、ある条件になるまで続けたい」というケースです。
例えば、ファイルのデータを最後まで読み込むとか、エラーが発生するまで処理を続けるとか、そんなときに使うのが `UNTIL` オプション。
UNTILは「~まで」という意味なので、まさにその通りの動きをします。
ちょっとだけ補足。UNTILには、条件を先にチェックする `TEST BEFORE`(これが普通)と、処理を1回やってからチェックする `TEST AFTER` があります。まあ、最初は「UNTILで条件を指定するんだな」くらいで大丈夫!
UNTIL指定の書き方
書き方は、基本形に `UNTIL 条件式` を付け加えます。
PERFORM 段落名 UNTIL 条件式. * TEST BEFORE/AFTER を明示する場合 PERFORM 段落名 WITH TEST BEFORE UNTIL 条件式. PERFORM 段落名 WITH TEST AFTER UNTIL 条件式.
「条件式」の部分には、変数と値を比べたりします。例えば、
- `WS-COUNTER > 10` (カウンターが10より大きくなるまで)
- `FILE-STATUS = "10"` (ファイルステータスが10になるまで ※ファイルの終わりを示すコード例)
- `WK-FLAG = "ON"` (フラグがONになるまで)
UNTIL指定を使ったサンプルプログラム
では、UNTILを使ったサンプルを見てみましょう。
カウンター変数 `WS-COUNT` が5より大きくなるまで、カウンターの値を表示し続けるプログラムです。
IDENTIFICATION DIVISION. PROGRAM-ID. PERFORM-UNTIL-SAMPLE. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-COUNT PIC 9(1) VALUE 1. *> カウンター変数、初期値は1 PROCEDURE DIVISION. MAIN-PROCEDURE. DISPLAY "UNTIL指定の実行開始". PERFORM COUNT-UP UNTIL WS-COUNT > 5. *> WS-COUNTが5より大きくなるまで実行 DISPLAY "UNTIL指定の実行終了". STOP RUN. COUNT-UP. *> ここが実行される段落 DISPLAY "現在のカウント: " WS-COUNT. ADD 1 TO WS-COUNT. *> カウンターを1増やす(条件を変える処理!)
実行結果はこちら。
UNTIL指定の実行開始 現在のカウント: 1 現在のカウント: 2 現在のカウント: 3 現在のカウント: 4 現在のカウント: 5 UNTIL指定の実行終了
ちゃんと `WS-COUNT` が 1 から 5 まで表示され、6になった時点で条件 `WS-COUNT > 5` が満たされてループが終わりましたね!
COBOL PERFORM文の使い方③:カウンターを使いながら繰り返す(VARYING指定)
さあ、PERFORM文のオプションのボスキャラ(?)登場! `VARYING` オプションです。
これは、カウンターとして使う変数を、指定した初期値から、指定した増分ずつ変化させながら、条件を満たすまで処理を繰り返すという、ちょっと高機能なやつです。
よく使われるのは、配列(テーブルと言います)のデータを順番に処理していくとき。カウンターを配列の添え字(インデックス)にして、1番目、2番目、3番目…と処理を進めるのにピッタリなんです。
`TIMES` や `UNTIL` よりちょっと複雑に見えるかもしれませんが、仕組みが分かれば大丈夫!
VARYING指定の書き方
書き方はこんな感じです。オプションがいくつか付きますね。
PERFORM 段落名 VARYING カウンター変数 FROM 初期値 BY 増分値 UNTIL 条件式.
それぞれの意味は、
- VARYING カウンター変数: 値を変化させていく変数(データ項目)を指定します。
- FROM 初期値: カウンター変数のスタート時の値を指定します。数字か、値が入った変数名を指定。
- BY 増分値: 1回の繰り返しでカウンター変数にいくつ足す(または引く)かを指定します。数字か変数名で。普通は1ずつ増やすことが多いですね。
- UNTIL 条件式: ループを終了する条件を指定します。UNTIL指定と同じです。
つまり、「カウンター変数を、初期値からスタートして、増分値ずつ変化させながら、条件式を満たすまで、段落を実行し続けてね!」という意味になります。
VARYING指定を使ったサンプルプログラム
言葉だけだと分かりにくいので、サンプルを見てみましょう。
カウンター `WS-INDEX` を1から1ずつ増やして、5になるまでその値を表示するプログラムです。
IDENTIFICATION DIVISION. PROGRAM-ID. PERFORM-VARYING-SAMPLE. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-INDEX PIC 9(1). *> カウンターとして使う変数 PROCEDURE DIVISION. MAIN-PROCEDURE. DISPLAY "VARYING指定の実行開始". PERFORM SHOW-INDEX VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > 5. *> 1から1ずつ増やし、5を超えたら終了 DISPLAY "VARYING指定の実行終了". STOP RUN. SHOW-INDEX. *> ここが実行される段落 DISPLAY "現在のインデックス: " WS-INDEX.
実行結果はこうです。
VARYING指定の実行開始 現在のインデックス: 1 現在のインデックス: 2 現在のインデックス: 3 現在のインデックス: 4 現在のインデックス: 5 VARYING指定の実行終了
UNTIL指定のサンプルと似た結果になりましたが、VARYINGを使うとカウンターの初期化と増やす処理を PERFORM文の中にまとめて書けるので、コードがスッキリしますね!
COBOL PERFORM文を使う上での注意点
便利なPERFORM文ですが、使い方を間違えると予期せぬ動きをしたり、バグの原因になったりすることも…。
ここでは、よくある失敗例と注意点をいくつか紹介します。転ばぬ先の杖ですよ!
- 無限ループにご用心!
特に `UNTIL` 指定を使うとき、ループの中で条件が変わるような処理(カウンターを増やすとか、フラグをONにするとか)を書き忘れると、永遠にループが終わらなくなります! プログラムが固まってしまうので、条件式の変数がちゃんと変化するか、必ず確認しましょう。 - 実行される範囲を意識しよう
`PERFORM 段落名.` と書いたとき、その段落がどこからどこまでなのか、しっかり把握しておかないと、意図しない処理まで実行されてしまうかもしれません。特に、段落の終わりを示すピリオドの位置は要チェックです。 - PERFORMの入れ子(ネスト)はほどほどに
PERFORM文の中で、さらに別のPERFORM文を呼び出すこともできます(入れ子、ネストと言います)。構造が複雑になりすぎると、プログラムの流れが追いづらくなり、バグの温床になることも。深くネストしすぎないように、処理の分割を見直すのも手です。 - PERFORMされる段落からの脱出
PERFORMで実行中の段落から、いきなり `GO TO` 文で別の場所に飛んだり、`EXIT PROGRAM` でプログラム自体を終わらせたりするのは、あまり良い作法ではありません。プログラムの流れが分かりにくくなる原因になります。できるだけ、PERFORMが終わって元の場所に戻るように作りましょう。
これらの点を頭の片隅に置いておくだけでも、ミスを減らせるはずです!
【まとめ】COBOL PERFORM文を使いこなしてステップアップ!
お疲れ様でした! COBOLの PERFORM文について、基本的なところから使い方、注意点まで見てきましたが、いかがでしたか?
PERFORM文は、
- 決まった処理を呼び出す
- 決まった回数繰り返す (TIMES)
- 条件を満たすまで繰り返す (UNTIL)
- カウンターを使いながら繰り返す (VARYING)
最初はちょっと戸惑うかもしれませんが、サンプルコードを参考に、実際に自分で書いて動かしてみるのが一番の近道!
さあ、学んだことを活かして、どんどんコードを書いてみましょう! PERFORM文と仲良くなって、COBOLの世界をもっと楽しんでくださいね!応援しています!
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。