COBOLのIF文と条件分岐を徹底解説!複雑化を防ぐコーディング規約
生徒
「COBOLで、もし数字が100だったらこの処理をする、みたいに条件によって動きを変えるにはどうすればいいですか?」
先生
「それにはIF文という命令を使います。条件文はプログラムの基本ですが、書き方を工夫しないと中身がごちゃごちゃになって読みづらくなってしまうんですよ。」
生徒
「読みづらくなるとどうなるんですか?」
先生
「バグという間違いを見つけにくくなってしまいます。今日は、きれいで分かりやすい条件文の書き方と、複雑にしないためのテクニックを勉強しましょう!」
1. if文とは?
COBOLのIF文は、プログラム内で条件に応じて処理を分岐させるためのものです。例えば、ある条件が真(正しい)であれば特定の処理を実行し、そうでなければ別の処理をしたり、あるいは何もしなかったりといった操作が可能になります。分岐処理を理解することで、プログラムの流れを制御できるようになり、より複雑なアプリケーションを作ることができるようになります。
プログラミングを全くしたことがない方のために例えると、信号機のようなものです。もし信号が赤なら止まる、青なら進むといった判断を、コンピューターに教えてあげるのがこの命令の役割です。この判断基準のことを条件式と呼び、その結果によって道が分かれるので分岐と呼ばれます。
2. 基本的なIF文の書き方とルール
COBOLで条件文を書くときは、英語の文章のように記述します。基本の形は、もし(IF)条件が正しければ、そのとき(THEN)この処理をする、という流れになります。そして、最後に必ずここでおしまい(END-IF)という目印をつけます。
ここで大事な用語の解説をします。真(しん)とは、条件がぴったり当てはまること。偽(ぎ)とは、条件が外れることです。例えば、年齢が20歳以上という条件に対して、25歳の人は真、15歳の人は偽となります。この真と偽によって、実行される命令が切り替わります。
IF KAKAKU > 5000 THEN
DISPLAY "この商品は高額です"
END-IF
上記の例では、価格(KAKAKU)というデータの箱の中身が5000より大きい場合にのみ、画面にメッセージを表示します。5000以下だった場合は、何も表示されずに次の処理へ進みます。
3. ELSEを使った「そうでなければ」の処理
条件に当てはまらなかった場合にも何か処理をさせたいときは、ELSE(エルス)という言葉を使います。これは日本語で「さもなければ」や「そうでなければ」という意味です。これを使うことで、二択の判断をさせることができます。
例えば、点数が80点以上なら合格、それ以外なら不合格と表示したい場合、わざわざ2回IF文を書く必要はありません。一つのIF文の中に、合格の場合の処理と不合格の場合の処理をまとめて書くことができるのです。これにより、プログラムが短くなり、読みやすさも向上します。
IF TENSU >= 80 THEN
DISPLAY "おめでとう!合格です"
ELSE
DISPLAY "残念、不合格です"
END-IF
実行結果は、点数によって次のように変わります。
点数が90点の場合:おめでとう!合格です
点数が70点の場合:残念、不合格です
4. 比較演算子と論理演算子の種類
条件を作るときには、記号を使って数字や文字を比べます。これを比較演算子と呼びます。COBOLでは記号だけでなく、英語の単語で書くこともできます。初心者のうちは、数学で習った記号を使う方がイメージしやすいかもしれません。
=またはEQUAL TO:等しい>またはGREATER THAN:より大きい<またはLESS THAN:より小さい>=またはGREATER THAN OR EQUAL TO:以上<=またはLESS THAN OR EQUAL TO:以下
また、複数の条件を組み合わせたいときは、AND(かつ)や OR(または)を使います。これを論理演算子と言います。例えば、年齢が20歳以上、かつ(AND)、所持金が1000円以上、といった複雑な条件を作ることが可能です。
5. 入れ子(ネスト)構造とその注意点
IF文の中に、さらに別のIF文を書くことを入れ子(ネスト)と呼びます。例えば、もし男性なら、さらに、もし20歳以上なら、といった二段構えの判断が必要なときに使います。しかし、この入れ子が三段階、四段階と深くなっていくと、プログラムはあっという間に迷路のようになってしまいます。
パソコンの操作に慣れていない方が複雑な迷路のような説明書を読まされるのを想像してください。どこを読んでいるのか分からなくなりますよね。プログラミングでも同じです。入れ子が深すぎると、後から修正するときにどこを直せばいいのか分からず、ミスが発生しやすくなります。コーディング規約(プログラムを書く時のルール)では、この入れ子の深さを2回か3回までにするように制限することが一般的です。
IF SEIBETSU = "M" THEN
IF AGE >= 20 THEN
DISPLAY "男性の成人です"
ELSE
DISPLAY "男性の未成年です"
END-IF
END-IF
6. 複雑化を防ぐテクニック1:正論理で書く
条件文を読みやすくするコツの一つに「肯定的な文章で書く」というものがあります。これを正論理と呼びます。逆に「~ではない場合に、~でない処理をする」という否定的な書き方を負論理と呼びますが、これは人間の脳にとって理解しにくい形です。
例えば、「もし在庫がゼロでないならば、注文を受ける」と書くよりも、「もし在庫があるならば、注文を受ける」と書くほうが直感的です。プログラムを書くときは、できるだけ「はい」の場合にメインの処理が来るように設計しましょう。これだけで、他人が見たときに内容がスッと入ってくるようになります。
7. 複雑化を防ぐテクニック2:EVALUATE文の活用
もし条件が三つ以上ある場合、IF文を何度もつなげるのは得策ではありません。COBOLには、たくさんの選択肢から一つを選ぶための専用命令 EVALUATE(エバリュエート)文があります。これは他の言語でいうスイッチ文のようなものです。
例えば、おみくじの結果が1なら大吉、2なら中吉、3なら小吉と分けるとき、IF文だと何度も同じ項目を比べなければなりませんが、EVALUATE文なら表のようにスッキリと書くことができます。これにより、プログラムの縦の長さが抑えられ、全体の見通しが良くなります。
EVALUATE OMIKUJI-NO
WHEN 1
DISPLAY "大吉です"
WHEN 2
DISPLAY "中吉です"
WHEN 3
DISPLAY "小吉です"
WHEN OTHER
DISPLAY "凶です"
END-EVALUATE
8. 条件名(88番項目)を使って言葉で判断する
COBOL独自の非常に便利な機能に条件名というものがあります。これは、データの定義段階で数字に名前をつけておく機能です。例えば、性別という箱の中身が1なら男性、2なら女性と決まっている場合、プログラムの中で数字の1や2を使うのではなく、男性という名前で判定できるようにします。
プログラミング未経験の方は、数字の羅列を見ると「この1って何の意味だっけ?」と混乱してしまいます。しかし、IF DANSEI(もし男性なら)と書ければ、まるで英語を読んでいるかのように内容を理解できます。これを活用することで、複雑な条件式をシンプルな言葉に置き換えることができ、間違いを劇的に減らすことができます。
9. ピリオドの打ち方とEND-IFの重要性
古い時代のCOBOLでは、IF文の終わりをピリオド . だけで示していました。しかし、現代の書き方では END-IF という終わりを明示する言葉を使います。これは、ピリオドを打ち忘れたり、逆に打ちすぎたりすることで発生する重大なミスを防ぐためです。
もしIF文の途中でうっかりピリオドを打ってしまうと、そこで条件分岐が強制終了されてしまいます。その後の命令は、条件に関係なく常に実行されてしまうことになり、銀行のシステムなどでは大変なトラブルに繋がります。そのため、最新のコーディング規約では「ピリオドは手続きの最後に一回だけ打ち、IF文の終わりは必ずEND-IFで閉じる」というルールが徹底されています。
10. 保守性の高いプログラムを目指して
プログラミングにおいて、一度書いたプログラムがそのまま一生使われることは稀です。多くの場合、後から機能を追加したり、不具合を直したりといった保守という作業が発生します。条件文をシンプルに保つことは、未来の自分や仲間のための優しさでもあります。
一つのIF文にたくさんの条件を詰め込みすぎないこと、インデント(段落下げ)を正しく使って見た目を整えること、そして今回紹介したようなテクニックを駆使すること。これらを意識するだけで、あなたの書くCOBOLソースコードはプロ級の品質に近づきます。パソコンに触れたばかりの方も、まずはこの「読みやすさ」を第一に考えて練習してみてください。