【COBOL学習|実務向け】EVALUATE文で境界値判定をスマートに!THRU句の活用術

はじめに:なぜEVALUATEのTHRU句が重要なのか

COBOLプログラミングにおいて、ある値が特定の範囲内に収まっているかを判定する処理は非常に頻繁に登場します。例えば、点数によって評価を変えたり、コード値で処理を分岐させたりする場面です。従来は、複数のIF文をAND条件で繋げたり、複雑な論理演算を駆使したりする必要がありました。しかし、これらの方法は記述が煩雑になりがちで、特に境界値(範囲の端の値)の判定でミスを誘発しやすいため、コードの可読性や保守性を低下させる原因となっていました。

EVALUATE文のTHRU句(範囲合致)は、このような課題をスマートに解決してくれる構造化制御構文です。これにより、範囲判定を簡潔かつ直感的に記述でき、エラーの少ない、読みやすいコードを作成することが可能になります。

EVALUATE文とTHRU句の基礎知識

EVALUATE文は、COBOLにおける多分岐処理を行うための強力な構造化制御構文です。IF文のネストを減らし、コードを整理するのに役立ちます。基本的な構文は以下のようになります。

EVALUATE data-item
WHEN value1
PERFORM …
WHEN value2, value3
PERFORM …
WHEN OTHER
PERFORM …
END-EVALUATE.

THRU句は、このEVALUATE文のWHEN句で利用できる機能の一つです。ある値が、指定した二つの値(開始値と終了値)の間の範囲に含まれている場合に真と判定します。この「範囲」は、数値だけでなく、文字リテラル(文字列)でも指定可能です。

例えば、「A」から「G」までの範囲であれば、「A」、「B」、「C」、「D」、「E」、「F」、「G」のいずれかに一致する場合に処理を実行させることができます。

EVALUATE文におけるTHRU句の実装と解決策

THRU句を使用することで、複雑な境界値判定を非常にシンプルに記述できます。

例えば、以下のような処理を考えてみましょう。

「成績が60点未満なら「不可」、60点以上80点未満なら「可」、80点以上100点以下なら「優」と判定する」

これを従来のIF文で書くと、以下のようになります。

IF SCORE < 60 DISPLAY "不可" ELSE IF SCORE < 80 DISPLAY "可" ELSE DISPLAY "優" END-IF. 一方、EVALUATE文とTHRU句を使うと、このように記述できます。 EVALUATE SCORE WHEN 0 THRU 59 DISPLAY "不可" WHEN 60 THRU 79 DISPLAY "可" WHEN 80 THRU 100 DISPLAY "優" WHEN OTHER DISPLAY "不正な点数です" END-EVALUATE. このように、THRU句を使うことで、各条件が何を表しているのかが明確になり、コードの意図が伝わりやすくなります。また、境界値である「59」や「79」、「80」といった数値の指定ミスを防ぎやすくなります。

サンプルプログラム

ここでは、EVALUATE文のTHRU句を使った具体的なサンプルプログラムを示します。このプログラムは、入力されたアルファベットがどのグループに属するかを判定します。

IDENTIFICATION DIVISION.
PROGRAM-ID. EVALUATE-THRU-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 INPUT-CHAR PIC X(1).
01 DISPLAY-MSG PIC X(30).

PROCEDURE DIVISION.
MAIN-PROCEDURE.
DISPLAY “アルファベットを入力してください (A-Z): ” WITH NO ADVANCING.
ACCEPT INPUT-CHAR.

MOVE SPACES TO DISPLAY-MSG.

EVALUATE FUNCTION UPPER-CASE(INPUT-CHAR) > 大文字に統一して判定
WHEN “A” THRU “E”
STRING “文字 ‘”
INPUT-CHAR
“‘ はグループ 1 に属します。”
DELIMITED BY SIZE
INTO DISPLAY-MSG
WHEN “F” THRU “J”
STRING “文字 ‘”
INPUT-CHAR
“‘ はグループ 2 に属します。”
DELIMITED BY SIZE
INTO DISPLAY-MSG
WHEN “K” THRU “O”
STRING “文字 ‘”
INPUT-CHAR
“‘ はグループ 3 に属します。”
DELIMITED BY SIZE
INTO DISPLAY-MSG
WHEN “P” THRU “T”
STRING “文字 ‘”
INPUT-CHAR
“‘ はグループ 4 に属します。”
DELIMITED BY SIZE
INTO DISPLAY-MSG
WHEN “U” THRU “Z”
STRING “文字 ‘”
INPUT-CHAR
“‘ はグループ 5 に属します。”
DELIMITED BY SIZE
INTO DISPLAY-MSG
WHEN OTHER
STRING “不正な入力です。アルファベット(A-Z)を入力してください。”
DELIMITED BY SIZE
INTO DISPLAY-MSG
END-EVALUATE.

DISPLAY DISPLAY-MSG.

STOP RUN.

このサンプルでは、`FUNCTION UPPER-CASE` を使用して、入力された文字を大文字に変換してから判定しています。これにより、大文字・小文字を区別せずにグループ分けができます。また、`STRING`ステートメントを使って、メッセージを組み立てる例も示しています。

応用と注意点

応用例

  • コード値による処理分岐: 商品コードの範囲によって割引率を変える、顧客ランクの範囲でサービス内容を変えるなど。
  • 日付範囲の判定: 特定の期間内のデータを処理する際に、日付の範囲を指定する。ただし、日付型の場合は直接THRU句で指定できない場合があるため、年・月・日の要素に分解したり、計算で範囲を判定したりする工夫が必要な場合があります。
  • 文字リテラルの範囲指定: 姓の頭文字でグループ分けする、特定の文字種別(数字、記号など)を判定するなど。

注意点

  • 境界値の正確な指定: THRU句の開始値と終了値は、その範囲に含まれます。例えば `WHEN 10 THRU 20` は、10から20までの整数すべてにマッチします。判定したい範囲を正確に把握し、境界値を誤らないように注意してください。
  • 重複する範囲: WHEN句の条件が重複している場合、最初に一致したWHEN句の処理が実行されます。意図しない順序にならないように、WHEN句の順番には注意が必要です。
  • データ型の整合性: EVALUATE対象のデータ項目とWHEN句で指定する値のデータ型は一致させる必要があります。数値と文字リテラルを混在させる場合は、型変換を適切に行うか、どちらかに統一するようにしましょう。
  • OTHER句の活用: 想定外の値や範囲外の値に対する処理を定義するために、`WHEN OTHER`句を記述することを強く推奨します。これにより、予期せぬエラーや不具合の発生を防ぐことができます。

EVALUATE文のTHRU句を使いこなすことで、COBOLプログラムの品質を向上させ、開発効率を高めることができます。ぜひ、日々のコーディングで活用してみてください。

コメント

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