COBOLのはじめ方!条件分岐(IF…ELSE, EVALUATE)

プログラミングでは、「もし○○だったら××する、そうでなければ△△する」といったように、条件によって処理の流れを変えたい場面がたくさんあります。COBOLでは、このような条件分岐を実現するために主にIF文EVALUATE文が使われます。

このステップでは、これらの基本的な使い方と、どのような場合にどちらを使うべきかを学んでいきましょう! 😊


Warning: Undefined array key “is_admin” in /home/c2261046/public_html/omomuki-tech.com/wp-content/themes/sango-theme/library/gutenberg/dist/classes/Toc.php on line 113

Warning: Undefined array key “is_category_top” in /home/c2261046/public_html/omomuki-tech.com/wp-content/themes/sango-theme/library/gutenberg/dist/classes/Toc.php on line 118

Warning: Undefined array key “is_top” in /home/c2261046/public_html/omomuki-tech.com/wp-content/themes/sango-theme/library/gutenberg/dist/classes/Toc.php on line 124

1. IF文:基本的な条件分岐はおまかせ!

IF文は、最も基本的な条件分岐の方法です。指定した条件が真(True)か偽(False)かによって、実行する処理を分けます。

基本的な構文

IF文はいくつかの形式がありますが、基本的な形は次のとおりです。


IF 条件式 THEN
    条件式が真(True)の場合に実行する処理...
ELSE
    条件式が偽(False)の場合に実行する処理...
END-IF.
                
  • IF:条件分岐の開始を示します。
  • 条件式:真か偽かを判定するための式です。(例:SCORE >= 60
  • THEN:条件式が真の場合の処理を記述する部分の開始を示します。(省略可能な場合もあります)
  • ELSE:条件式が偽の場合の処理を記述する部分の開始を示します。ELSE以降は必要なければ省略できます。
  • END-IF:IF文の終わりを明確に示すための範囲符です。COBOL’85標準で導入され、複雑なIF文でも構造を分かりやすくするために推奨されます。END-IFの代わりにピリオド(.)でIF文を終了することもできますが、特にネスト(入れ子)構造にする場合はEND-IFの使用が推奨されます。

使用例:点数による合否判定

例えば、テストの点数(SCORE)が60点以上なら「合格」、そうでなければ「不合格」と表示するプログラムは次のようになります。


IDENTIFICATION DIVISION.
PROGRAM-ID. IF-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SCORE PIC 9(3) VALUE 75.
PROCEDURE DIVISION.
    IF SCORE >= 60 THEN
        DISPLAY "点数: " SCORE " → 合格です! 🎉"
    ELSE
        DISPLAY "点数: " SCORE " → 不合格です... 😢"
    END-IF.
    STOP RUN.
                

この例では、SCOREが75なので、SCORE >= 60という条件式は真(True)となり、「合格です!」が表示されます。

条件式で使える比較演算子

IF文の条件式では、主に以下のような比較演算子が使えます。

演算子 意味 英語表記での書き方 (推奨)
= 等しい IS EQUAL TO
> より大きい IS GREATER THAN
< より小さい IS LESS THAN
>= 以上 IS GREATER THAN OR EQUAL TO
<= 以下 IS LESS THAN OR EQUAL TO
NOT = 等しくない IS NOT EQUAL TO

記号での記述も可能ですが、英語表記の方が可読性が高いため、一般的には英語表記が推奨されます。✅

その他の条件の種類

比較条件の他にも、以下のような条件があります。

  • 符号条件 (Sign Condition): IS POSITIVE, IS NEGATIVE, IS ZERO を使って、数値が正、負、ゼロかを判定します。
  • クラス条件 (Class Condition): IS NUMERIC, IS ALPHABETIC などを使って、データの内容が数字か、英字かなどを判定します。
  • 条件名条件 (Condition-Name Condition): データ定義部(DATA DIVISION)のレベル88で定義した条件名を使って判定します。
  • 複合条件 (Combined Condition): AND (かつ) や OR (または) を使って複数の条件を組み合わせます。(例:AGE >= 20 AND GENDER = "M"
  • 否定条件 (Negated Condition): NOT を使って条件の真偽を反転させます。(例:NOT SCORE < 60

ネスト(入れ子)IF文

IF文の中にさらにIF文を入れることも可能です。これをネストまたは入れ子と呼びます。


IF 条件式1 THEN
    IF 条件式2 THEN
        処理A
    ELSE
        処理B
    END-IF
ELSE
    処理C
END-IF.
                

ただし、ネストが深くなりすぎるとプログラムが複雑になり、読みにくくなる原因になります。そのような場合は、次に説明するEVALUATE文の使用を検討しましょう。💡

2. EVALUATE文:複数の条件分岐をスマートに!

EVALUATE文は、特定の値や条件に基づいて、複数の分岐処理を行いたい場合に非常に便利です。他のプログラミング言語におけるswitch文やcase文に似ていますが、より柔軟な条件設定が可能です。

特に、ネストしたIF文が複雑になりそうな場合に、EVALUATE文を使うとコードがすっきりと読みやすくなります。✨

基本的な構文

EVALUATE文の基本的な構文は以下の通りです。


EVALUATE 評価対象
    WHEN 条件1
        条件1に一致した場合の処理...
    WHEN 条件2
        条件2に一致した場合の処理...
    WHEN 条件3 THRU 条件4
        条件3から条件4の範囲に一致した場合の処理...
    WHEN OTHER
        上記のいずれの条件にも一致しなかった場合の処理...
END-EVALUATE.
                
  • EVALUATE:評価の開始を示します。評価対象には、変数名、定数、式、あるいはTRUEFALSEを指定できます。
  • WHEN:評価する条件を指定します。
  • THRU (または THROUGH):値の範囲を指定する場合に使用します。(例:WHEN 1 THRU 5
  • OTHER:どのWHEN節にも一致しなかった場合に実行される処理を指定します。省略可能です。
  • END-EVALUATE:EVALUATE文の終わりを示す範囲符です。

使用例:点数による成績評価

点数(SCORE)に応じて成績(GRADE)を付ける場合、IF文をネストさせるよりもEVALUATE文を使う方が分かりやすくなります。


IDENTIFICATION DIVISION.
PROGRAM-ID. EVALUATE-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SCORE PIC 9(3) VALUE 85.
01 GRADE PIC X(1).
PROCEDURE DIVISION.
    EVALUATE TRUE *> 条件式自体を評価対象にする
        WHEN SCORE >= 90
            MOVE "A" TO GRADE
        WHEN SCORE >= 80 *> 90未満で80以上
            MOVE "B" TO GRADE
        WHEN SCORE >= 70 *> 80未満で70以上
            MOVE "C" TO GRADE
        WHEN SCORE >= 60 *> 70未満で60以上
            MOVE "D" TO GRADE
        WHEN OTHER       *> 60未満
            MOVE "F" TO GRADE
    END-EVALUATE.

    DISPLAY "点数: " SCORE " → 成績: " GRADE.

    STOP RUN.
                

この例では、EVALUATE TRUEとして、各WHEN節の条件式が真になるかどうかを評価しています。SCOREが85なので、WHEN SCORE >= 80が最初に真となり、GRADEに”B”が設定されます。一致するWHENが見つかると、それ以降のWHEN節は評価されずにEND-EVALUATEの次に処理が移ります。

EVALUATE文の様々な形式

  • 特定の値で分岐: EVALUATE 変数名 WHEN 値1 ... WHEN 値2 ... のように、変数の値そのもので分岐します。
  • 範囲で分岐: WHEN 値1 THRU 値2 で範囲を指定できます。
  • 複数の値で同じ処理: WHEN 値1 WHEN 値2 WHEN 値3 処理... のように、複数のWHENを連続して記述すると、いずれかの値に一致した場合に同じ処理を実行できます。
  • 複数の条件を評価 (ALSO): EVALUATE 条件1 ALSO 条件2 WHEN 値A ALSO 値B ... のように、ALSOを使って複数の評価対象と条件を組み合わせることも可能です。

3. IF文とEVALUATE文の使い分け 🤔

IF文とEVALUATE文はどちらも条件分岐に使えますが、状況に応じて使い分けることで、より分かりやすく保守性の高いコードを書くことができます。

  • IF文が適している場合:
    • 単純な二者択一の分岐(「Aか、それ以外か」)。
    • 少数の独立した条件を判定する場合。
  • EVALUATE文が適している場合:
    • 一つの値や条件に対して、多数の分岐がある場合(多岐分岐)。
    • ネストしたIF文が深くなり、読みにくくなる場合。
    • 条件の範囲指定 (THRU) や、複数の値で同じ処理を行いたい場合。
    • コードの見た目をすっきりとさせたい場合。

基本的には、3つ以上の分岐がある場合や、IF文のネストが複雑になりそうな場合は、EVALUATE文の使用を検討すると良いでしょう。

まとめ

今回は、COBOLにおける基本的な条件分岐であるIF文と、多岐分岐に便利なEVALUATE文について学びました。

  • IF文は基本的な条件分岐に使われ、IF 条件 THEN 処理 ELSE 処理 END-IFの形で記述します。
  • EVALUATE文は多岐分岐に適しており、EVALUATE 対象 WHEN 条件 処理 ... END-EVALUATEの形で記述します。
  • 複雑な分岐やネストが深くなる場合は、EVALUATE文を使うとコードが読みやすくなります。

これらの文を適切に使い分けることで、プログラムの流れを効果的に制御し、分かりやすいコードを作成することができます。次のステップでは、繰り返し処理について学んでいきましょう!🚀