COBOLには、IF文による条件分岐の他にEVALUATEを使用した条件分岐が存在します。
今回は、EVALUATE文による条件分岐を紹介します。IF文による条件分岐は下記リンクをご覧ください。
EVALUATEを使用することで、IF文よりも多分岐を見やすく記述することができます。
IF-条件分岐(COBOL)を解説!複合条件についても解説します目次
基本的な使用方法
EVALUATE文は以下のように、「指定した変数が値Aに合致する値であれば、値Aの処理を実行する」というような使用方法となります。
EVALUATE 変数
WHEN 値A 処理
END-EVALUATE.
上記の場合、値Aに当てはまる場合は、処理を実行してEVALUATE文を抜けます。値Aに当てはまらない場合には、なにもせずに、EVALUATE文を抜けることとなります。
複数の値
複数の値を指定したい場合には、「WHEN」を追加していくことで実現することができます。
EVALUATE 変数
WHEN 値A 処理A
WHEN 値B 処理B
WHEN 値C 処理C
END-EVALUATE.
上記のようにすることで、複数の値を追加することができます。
この場合、上の値Aからその値に合致するかを見ていきます。つまり値Aに合致しない場合は値Bを見る、というような流れになっています。
もし、値Bに合致した場合には、値Cの処理Cは実行されずに、処理Bだけ実行されてEVALUATE文を抜けることになります。
IF文のように、条件を複数にしても、「END-EVALUATE」の数を増やす必要はありませんので、すっきりと記述することができます。
また、ネストが深くなることがないので、可読性にも影響を与えないよう記述することも可能です。
IFで同じように記述すると以下のようになります。
IF 条件A
THEN 処理A
ELSE 条件B
THEN 処理B
ELSE 条件C
THEN 処理C
END-IF
END-IF
END-IF.
変数が「1〜5」の場合(THRUの使用)
変数が「1」の場合に何か処理をしたい時には、「WHEN 1 処理」とすれば良いが、変数が「1〜5」のいずれかの場合に処理をしたい時の方法はどうすればよいだろうか。
その方法は、THRUを使用することである。
例えば変数が「1から5の間のいずれかの数値」の時処理したいときは、下記のように「1 THRU 5」と記述する。
こうすることで、「変数が1〜5の間の数値であれば、処理を行う」という条件にすることができる。
EVALUATE 変数
WHEN 1 THRU 5 処理
END-EVALUATE.
複数の値で同じ処理をする
複数の値で同じ処理をするには、WHENの後ろに処理を記述せず、複数のWHENを記述した後に処理を書くことで実現することが可能になります。
下記の例では、変数Aの値が「30、40」の場合には、標準出力で「ZYU」を出力し、変数Aの値が「1、2」の場合は「ITI」を出力する処理となっている。
EVALUATE A
WHEN 30
WHEN 40
DISPLAY "ZYU"
WHEN 1
WHEN 2
DISPLAY "ITI"
END-EVALUATE.
複数の値を評価して処理する(ALSOの使用)
先ほど解説した方法は、一つの変数を評価して、それぞれに応じて処理をする方法であった。
これから解説する方法は、複数の変数を評価して、その値に応じて処理をする方法である。
複数の変数を評価するためには、「ALSO」で変数を繋げることで実現することができます。
例えば、変数Aと変数Bを値に応じて処理したい時には、「変数A ALSO 変数B」とする。
値を評価する時にも、「変数Aの値 ALSO 変数Bの値」とする。
EVALUATE A ALSO B
WHEN 30 ALSO 20
DISPLAY "HELLO"
WHEN 20 ALSO 30
DISPLAY "WORLD"
WHEN other
DISPLAY "DIS"
END-EVALUATE.
条件式を使用する方法(TRUEの使用)
先ほど解説したのは、変数の値が、何かであるかによって処理が変わるものでした。
続いては、IFの条件式と同じように、条件式を記述することができる方法です。
条件式を使用するには、EVALUATEの変数を記述していた部分に、「TRUE」を指定することでできる。
EVALUATE TRUE
WHEN 条件式A 処理A
WHEN 条件式B 処理B
WHEN 条件式C 処理C
END-EVALUATE.
数の大小を比較する
数の大小を比較する、比較演算子を使用することも可能である。
下記の例では、変数Aがそれぞれの数値より小さい場合に、標準出力で「〜数値未満」と出力する処理となっています。
EVALUATE TRUE
WHEN A < 5
DISPLAY "5未満"
WHEN A < 10
DISPLAY "10未満"
WHEN A < 15
DISPLAY "15未満"
END-EVALUATE.
上記のように、A変数の大きさを比較することができる。
A変数が「4」であれば、「5未満」と表示される。
条件式の範囲は以下の通りとなっている。
EVALUATE文では、WHENを上から評価していくため、今回は「WHEN A < 5」を比較し、合致しなかった場合には「WHEN A < 10」を比較していく。
つまり、「WHEN 5 <= A < 10」としなくても、「5 <= A < 10」と同じことをしているということとなる。
また、「WHEN 5 <= A < 10」とすると、EVALUATE文ではエラーとなってしまうので、複数の条件式をまとめるのは注意が必要です。
複数の条件で同じ処理をする
複数の条件の時に同じ処理をしたい場合には、WHENを複数記述し、その最後に処理を一つ記述することで同じ処理を行うことができる。
下記の例では変数Aが「5」「30」「40」の時に文字列Aを標準出力するコードとなっています。
EVALUATE true
WHEN A = 5
WHEN A = 30
WHEN A = 40
DISPLAY "A"
END-EVALUATE.
複合条件の方法(A = B AND B = C)
条件をANDなどで結合する複合条件についても解説します。
IF文と同じように、ANDを使用することでEVALUATE文でも複合条件を使用することができます。
EVALUATE TRUE
WHEN A = 30 AND B = 20
DISPLAY "HELLO"
WHEN A = 20 AND B = 30
DISPLAY "WORLD"
WHEN other
DISPLAY "DIS"
END-EVALUATE.
どの条件にも当てはまらない場合(OTHER)
EVALUATEでは、どの条件にも当てはまらない場合には「ELSE」ではなく、「OTHER」を使用することで、どの条件にも当てはまらない場合を指定することができる。
EVALUATE TRUE
WHEN A < 5
DISPLAY "A"
WHEN OTHER
DISPLAY "OTHER"
END-EVALUATE.
上記は、変数Aが5未満でなければ、「OTHER」を出力します。
一部分だけ条件が合致しない場合(ANYの使用)
OTHERでは全ての条件に合致しなかった場合に使用することができる。
では、条件を結合したり、複数の値をALSOで連結して評価する場合、「その内一つはなんでも良い」のような場合にはどうするべきか。
その場合には、「ANY」を使用する。
下記コードの一つのWHENは、「変数Aは30、変数Bはなんでも良い」時に「A is 30. B is ANY」と出力し、
「変数Aはなんでも良くて、変数Bが30」の時に「A is ANY. B is 30」と出力するコードとなっている。
EVALUATE A ALSO B
WHEN 30 ALSO ANY
DISPLAY "A is 30. B is ANY"
WHEN ANY ALSO 30
DISPLAY "A is ANY. B is 30"
END-EVALUATE.