if / else
『COBOL』の IF 文は、条件式の真偽に応じて処理を分岐させる基本構文です。ELSE 句で偽の場合の処理を記述でき、END-IF スコープ終端を使うことで複数の条件分岐をネストしてすっきりと記述できます。
構文
*> -----------------------------------------------
*> IF 文の基本構文
*> -----------------------------------------------
*> 条件が真の場合のみ処理を実行します
IF 条件式
処理
END-IF.
*> ELSE 句 — 条件が偽の場合の処理を記述します
IF 条件式
真の場合の処理
ELSE
偽の場合の処理
END-IF.
*> -----------------------------------------------
*> ELSE IF によるチェーン(多分岐)
*> -----------------------------------------------
*> 複数の条件を順番に評価します(最初に真になった分岐だけ実行されます)
IF 条件式1
処理1
ELSE IF 条件式2
処理2
ELSE IF 条件式3
処理3
ELSE
どれにも一致しない場合の処理
END-IF.
*> -----------------------------------------------
*> 比較演算子の一覧
*> -----------------------------------------------
*> EQUAL TO / = 等しい
*> NOT EQUAL TO / NOT = 等しくない
*> GREATER THAN / > 大きい
*> LESS THAN / < 小さい
*> GREATER THAN OR EQUAL TO / >= 以上
*> LESS THAN OR EQUAL TO / <= 以下
*> -----------------------------------------------
*> 論理演算子
*> -----------------------------------------------
*> AND — 両方の条件が真のとき真になります
IF 条件式A AND 条件式B
処理
END-IF.
*> OR — どちらか一方が真のとき真になります
IF 条件式A OR 条件式B
処理
END-IF.
*> NOT — 条件を反転します
IF NOT 条件式
処理
END-IF.
構文一覧
| 構文 | 概要 |
|---|---|
IF 条件式 | 条件式が真のとき、直後の処理を実行します。 |
ELSE | 直前の IF または ELSE IF の条件が偽のときに実行する処理を記述します。 |
ELSE IF 条件式 | 追加の条件を評価します。前の条件が偽で、かつこの条件が真のときに処理が実行されます。 |
END-IF | IF 文のスコープを明示的に終了します。ネスト時の可読性向上に役立ちます。 |
EQUAL TO / = | 左辺と右辺が等しいかを比較します。 |
NOT EQUAL TO / NOT = | 左辺と右辺が等しくないかを比較します。 |
GREATER THAN / > | 左辺が右辺より大きいかを比較します。 |
LESS THAN / < | 左辺が右辺より小さいかを比較します。 |
GREATER THAN OR EQUAL TO / >= | 左辺が右辺以上かを比較します。 |
LESS THAN OR EQUAL TO / <= | 左辺が右辺以下かを比較します。 |
AND | 複数の条件をすべて満たすときに真になります。 |
OR | 複数の条件のうち少なくともひとつを満たすときに真になります。 |
NOT | 条件の真偽を反転します。 |
サンプルコード
jjk_if_else.cbl
*> jjk_if_else.cbl — IF / ELSE / END-IF のサンプルです
*> 呪術廻戦のキャラクターを使って
*> 条件分岐・多分岐(ELSE IF)・論理演算子(AND / OR / NOT)を確認します
*>
*> コンパイルと実行:
*> cobc -free -x jjk_if_else.cbl
*> ./jjk_if_else
IDENTIFICATION DIVISION.
PROGRAM-ID. JJK-IF-ELSE.
DATA DIVISION.
WORKING-STORAGE SECTION.
*> -----------------------------------------------
*> 呪術師のプロフィール
*> -----------------------------------------------
*> 名前(最大30文字の文字列型)
01 WS-NAME-ITADORI PIC X(30) VALUE "Itadori Yuji".
01 WS-NAME-FUSHIGURO PIC X(30) VALUE "Fushiguro Megumi".
01 WS-NAME-KUGISAKI PIC X(30) VALUE "Kugisaki Nobara".
01 WS-NAME-GOJO PIC X(30) VALUE "Gojo Satoru".
01 WS-NAME-NANAMI PIC X(30) VALUE "Nanami Kento".
*> 呪力レベル(数値型4桁)
01 WS-POWER-ITADORI PIC 9(4) VALUE 9200.
01 WS-POWER-FUSHIGURO PIC 9(4) VALUE 8500.
01 WS-POWER-KUGISAKI PIC 9(4) VALUE 7800.
01 WS-POWER-GOJO PIC 9(4) VALUE 9999.
01 WS-POWER-NANAMI PIC 9(4) VALUE 8900.
*> 等級(1文字。S=特級, A=1級, B=2級, C=準1級)
01 WS-GRADE-ITADORI PIC X(1) VALUE "S".
01 WS-GRADE-FUSHIGURO PIC X(1) VALUE "A".
01 WS-GRADE-KUGISAKI PIC X(1) VALUE "B".
01 WS-GRADE-GOJO PIC X(1) VALUE "S".
01 WS-GRADE-NANAMI PIC X(1) VALUE "A".
*> 判定結果を格納する文字列(最大40文字)
01 WS-RESULT PIC X(40) VALUE SPACES.
*> 比較対象となる呪力しきい値
01 WS-THRESHOLD-ELITE PIC 9(4) VALUE 9000.
01 WS-THRESHOLD-SENIOR PIC 9(4) VALUE 8000.
*> 区切り線
01 WS-LINE PIC X(52)
VALUE "----------------------------------------------------".
PROCEDURE DIVISION.
DISPLAY WS-LINE.
DISPLAY " 呪術廻戦 — 呪術師ランク判定システム".
DISPLAY WS-LINE.
DISPLAY " ".
*> -----------------------------------------------
*> 基本的な IF / ELSE 文
*> 五条悟の呪力が最大値(9999)かどうかを判定します
*> -----------------------------------------------
DISPLAY "[ 基本 IF / ELSE — 五条悟の呪力判定 ]".
DISPLAY " 呪力: " WS-POWER-GOJO.
IF WS-POWER-GOJO = 9999
DISPLAY " 判定: 無下限呪術の使い手。呪力が最大値に達しています。"
ELSE
DISPLAY " 判定: 呪力は最大値未満です。"
END-IF.
DISPLAY " ".
*> -----------------------------------------------
*> ELSE IF による多分岐
*> 各キャラクターの呪力レベルに応じてランクを振り分けます
*> -----------------------------------------------
DISPLAY "[ ELSE IF 多分岐 — 呪力ランク振り分け ]".
*> 虎杖悠仁の判定
DISPLAY " " WS-NAME-ITADORI " (呪力: " WS-POWER-ITADORI ")".
IF WS-POWER-ITADORI >= WS-THRESHOLD-ELITE
MOVE "特級相当 — 宿儺の指を宿す特異体質です。" TO WS-RESULT
ELSE IF WS-POWER-ITADORI >= WS-THRESHOLD-SENIOR
MOVE "1級相当 — 高い呪力を持つ上位呪術師です。" TO WS-RESULT
ELSE
MOVE "2級以下 — さらなる修行が必要です。" TO WS-RESULT
END-IF.
DISPLAY " → " WS-RESULT.
*> 伏黒恵の判定
DISPLAY " " WS-NAME-FUSHIGURO " (呪力: " WS-POWER-FUSHIGURO ")".
IF WS-POWER-FUSHIGURO >= WS-THRESHOLD-ELITE
MOVE "特級相当 — 十種影法術の頂点に立つ実力です。" TO WS-RESULT
ELSE IF WS-POWER-FUSHIGURO >= WS-THRESHOLD-SENIOR
MOVE "1級相当 — 高い呪力を持つ上位呪術師です。" TO WS-RESULT
ELSE
MOVE "2級以下 — さらなる修行が必要です。" TO WS-RESULT
END-IF.
DISPLAY " → " WS-RESULT.
*> 釘崎野薔薇の判定
DISPLAY " " WS-NAME-KUGISAKI " (呪力: " WS-POWER-KUGISAKI ")".
IF WS-POWER-KUGISAKI >= WS-THRESHOLD-ELITE
MOVE "特級相当 — 特級の呪力を持つ実力者です。" TO WS-RESULT
ELSE IF WS-POWER-KUGISAKI >= WS-THRESHOLD-SENIOR
MOVE "1級相当 — 高い呪力を持つ上位呪術師です。" TO WS-RESULT
ELSE
MOVE "2級以下 — 芻霊呪法をさらに磨く余地がある。" TO WS-RESULT
END-IF.
DISPLAY " → " WS-RESULT.
DISPLAY " ".
*> -----------------------------------------------
*> AND 演算子
*> 呪力が高く(9000以上)かつ等級が特級("S")の呪術師を判定します
*> -----------------------------------------------
DISPLAY "[ AND 演算子 — 呪力 >= 9000 かつ等級 = S ]".
IF WS-POWER-GOJO >= WS-THRESHOLD-ELITE AND WS-GRADE-GOJO = "S"
DISPLAY " " WS-NAME-GOJO ": 呪力・等級ともに最高位。六眼と無下限を持ちます。"
ELSE
DISPLAY " " WS-NAME-GOJO ": 条件を満たしていません。"
END-IF.
IF WS-POWER-FUSHIGURO >= WS-THRESHOLD-ELITE AND WS-GRADE-FUSHIGURO = "S"
DISPLAY " " WS-NAME-FUSHIGURO ": 呪力・等級ともに最高位。特級に相当します。"
ELSE
DISPLAY " " WS-NAME-FUSHIGURO
": 呪力または等級が最高位の条件を満たしていません。"
END-IF.
DISPLAY " ".
*> -----------------------------------------------
*> OR 演算子
*> 呪力が 9000 以上または等級が "S" の呪術師を抽出します
*> -----------------------------------------------
DISPLAY "[ OR 演算子 — 呪力 >= 9000 または等級 = S ]".
IF WS-POWER-ITADORI >= WS-THRESHOLD-ELITE OR WS-GRADE-ITADORI = "S"
DISPLAY " " WS-NAME-ITADORI ": 特級条件に該当します。"
ELSE
DISPLAY " " WS-NAME-ITADORI ": 特級条件に該当しません。"
END-IF.
IF WS-POWER-NANAMI >= WS-THRESHOLD-ELITE OR WS-GRADE-NANAMI = "S"
DISPLAY " " WS-NAME-NANAMI ": 特級条件に該当します。"
ELSE
DISPLAY " " WS-NAME-NANAMI ": 特級条件に該当しません。"
END-IF.
DISPLAY " ".
*> -----------------------------------------------
*> NOT 演算子
*> 等級が "S" ではないキャラクターを判定します
*> -----------------------------------------------
DISPLAY "[ NOT 演算子 — 等級が S ではない呪術師 ]".
IF NOT WS-GRADE-NANAMI = "S"
DISPLAY " " WS-NAME-NANAMI ": 特級ではありません。"
" 等級: " WS-GRADE-NANAMI.
ELSE
DISPLAY " " WS-NAME-NANAMI ": 特級です。"
END-IF.
IF NOT WS-GRADE-GOJO = "S"
DISPLAY " " WS-NAME-GOJO ": 特級ではありません。"
ELSE
DISPLAY " " WS-NAME-GOJO ": 特級です。等級: " WS-GRADE-GOJO.
END-IF.
DISPLAY " ".
DISPLAY WS-LINE.
DISPLAY " 判定完了。".
DISPLAY WS-LINE.
*> STOP RUN でプログラムを正常終了します
STOP RUN.
cobc -free -x jjk_if_else.cbl && ./jjk_if_else ---------------------------------------------------- 呪術廻戦 — 呪術師ランク判定システム ---------------------------------------------------- [ 基本 IF / ELSE — 五条悟の呪力判定 ] 呪力: 9999 判定: 無下限呪術の使い手。呪力が最大値に達しています。 [ ELSE IF 多分岐 — 呪力ランク振り分け ] Itadori Yuji (呪力: 9200) → 特級相当 — 宿儺の指を宿す特異体質です。 Fushiguro Megumi (呪力: 8500) → 1級相当 — 高い呪力を持つ上位呪術師です。 Kugisaki Nobara (呪力: 7800) → 2級以下 — 芻霊呪法をさらに磨く余地がある。 [ AND 演算子 — 呪力 >= 9000 かつ等級 = S ] Gojo Satoru: 呪力・等級ともに最高位。六眼と無下限を持ちます。 Fushiguro Megumi: 呪力または等級が最高位の条件を満たしていません。 [ OR 演算子 — 呪力 >= 9000 または等級 = S ] Itadori Yuji: 特級条件に該当します。 Nanami Kento: 特級条件に該当しません。 [ NOT 演算子 — 等級が S ではない呪術師 ] Nanami Kento: 特級ではありません。 等級: A Gojo Satoru: 特級です。等級: S ---------------------------------------------------- 判定完了。 ----------------------------------------------------
概要
『COBOL』の IF 文は、指定した条件式が真かどうかを評価して処理を分岐させる基本制御構文です。ELSE 句を続けることで条件が偽の場合の処理を記述でき、ELSE IF を連ねることで複数条件の多分岐を表現できます。スコープ終端には END-IF を使うと入れ子の構造が明確になり、可読性が向上します。比較演算子には英語キーワード(EQUAL TO・GREATER THAN など)と記号(=・>・< など)の両方が使えます。複数条件を組み合わせるには AND(すべて真のとき真)・OR(いずれかが真のとき真)・NOT(真偽を反転)を使います。条件に応じた繰り返し処理については PERFORM UNTIL を、値の移動と初期化については MOVE を合わせて確認できます。
よくあるミス
ミス1: END-IF を書き忘れる(ピリオドでスコープが閉じてしまう)
END-IF を省略してピリオド(.)でスコープを閉じると、ピリオドより前にある全ての IF 文が閉じられます。入れ子の IF で END-IF を省略すると意図しないスコープになります。END-IF を常に書く方が安全です。
*> NG: END-IF を省略してピリオドで閉じる(入れ子で問題が起きやすい)
IF WS-POWER-GOJO = 9999
DISPLAY "最強"
IF WS-GRADE-GOJO = "S"
DISPLAY "特級". *> このピリオドで両方の IF が閉じる
*> OK: END-IF を必ず書いてスコープを明示する
IF WS-POWER-GOJO = 9999
DISPLAY "最強"
IF WS-GRADE-GOJO = "S"
DISPLAY "特級"
END-IF
END-IF.
ミス2: ピリオドの位置でスコープが意図せず閉じる
COBOL では文の途中にピリオドを置くとそこで全ての開いているスコープが強制的に閉じられます。IF ブロックの中でピリオドを誤って書くと、END-IF より前にスコープが閉じて後続の処理が IF の外になります。
*> NG: IF ブロック内に誤ってピリオドを置くと ELSE が孤立する
IF WS-POWER-ITADORI >= 9000
MOVE "特級相当" TO WS-RESULT. *> ここでスコープが閉じる
ELSE *> この ELSE は対応する IF がなくエラー
MOVE "訓練中" TO WS-RESULT
END-IF.
*> OK: IF ブロック内ではピリオドを付けない
IF WS-POWER-ITADORI >= 9000
MOVE "特級相当" TO WS-RESULT
ELSE
MOVE "訓練中" TO WS-RESULT
END-IF.
ミス3: ELSE IF の代わりに ELSE を使って深いネストになる
多段階の条件分岐で ELSE IF の代わりに ELSE の中に IF を入れ子にすると、END-IF の数がその分だけ増えてコードが深くネストします。ELSE IF を使うとフラットに書けます。
*> NG: ELSE の中に IF を入れ子にして深いネストになる
IF WS-POWER-ITADORI >= 9000
MOVE "特級相当" TO WS-RESULT
ELSE
IF WS-POWER-ITADORI >= 8000
MOVE "1級相当" TO WS-RESULT
ELSE
IF WS-POWER-ITADORI >= 7000
MOVE "2級相当" TO WS-RESULT
ELSE
MOVE "訓練中" TO WS-RESULT
END-IF
END-IF
END-IF.
*> OK: ELSE IF でフラットに書く
IF WS-POWER-ITADORI >= 9000
MOVE "特級相当" TO WS-RESULT
ELSE IF WS-POWER-ITADORI >= 8000
MOVE "1級相当" TO WS-RESULT
ELSE IF WS-POWER-ITADORI >= 7000
MOVE "2級相当" TO WS-RESULT
ELSE
MOVE "訓練中" TO WS-RESULT
END-IF.
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。