COBOLのプログラムを書いていて、「引き算くらい簡単でしょ」と思ったら、SUBTRACT命令の構文で軽くつまずいた…なんて経験はありませんか?
この記事では、SUBTRACT命令の基本構文から使い方のコツ、現場でもよく使われる実用例、注意したい落とし穴まで、まるっと解説します。
つまづきやすいポイントを避けつつ、初心者でもサクッと理解できる内容になっているので、「SUBTRACTマスターへの第一歩」を踏み出してみませんか?
この記事で学べること
・SUBTRACT命令の基本的な書き方と動き
・3つの構文パターンと使い分け
・動くサンプルプログラムの紹介
・桁あふれ(オーバーフロー)を防ぐ方法
・実務でよくあるSUBTRACTの使い方
COBOL算術命令SUBTRACTとは?
COBOLで「引き算」をするには、SUBTRACT命令を使います。名前からして、なんとなく意味はわかりやすいですね。
たとえば、在庫の数を減らしたいときや、銀行口座の残高から出金額を引きたいとき。この命令を使えば、スパッと計算できます。
SUBTRACTは、加算命令(ADD)と並んで基本中の基本。使い方を覚えておくと、他の処理もグッと楽になります。
最初は少し戸惑うかもしれませんが、慣れれば簡単。暗算より安心です。
COBOL算術命令SUBTRACTの基本構文
SUBTRACT命令には、書き方にいくつかのパターンがあります。
ここからは、まずよく使われる2つの形式について見ていきましょう。
構文1: SUBTRACT 変数1 FROM 変数2
まず最初に紹介するのは、SUBTRACT 変数1 FROM 変数2という構文です。
SUBTRACT A FROM B.
これは「BからAを引いて、その結果をBに上書きする」という意味になります。
ちょっとイメージしにくいかもしれないので、次の図で見てみましょう。
A = 3 B = 10 SUBTRACT A FROM B → B = 7(10から3を引いた結果がBに入る)
FROMの後ろの変数が「引かれる数」です。先に書かれているAは「引く数」ですね。
つまり、計算式としては「B - A」のイメージ。ただし、結果がBに入るので、元のBは消えてしまいます。
「あれ?Bが元の値じゃなくなっちゃうの?」と思ったあなた、安心してください。そんなときには次の構文が便利です。
構文2: SUBTRACT 変数1 FROM 変数2 GIVING 変数3
続いて紹介するのが、SUBTRACT 変数1 FROM 変数2 GIVING 変数3という形式です。
SUBTRACT A FROM B GIVING C.
意味は「BからAを引いて、結果をCに入れる」ということ。先ほどの構文との大きな違いは、元の変数(BやA)の値を変えない点です。
A = 3 B = 10 SUBTRACT A FROM B GIVING C → C = 7(Bは10のまま、Aは3のまま)
計算結果を他の場所に保管しておきたいときに便利です。元のデータを壊さずに、引き算だけ済ませたいときにはピッタリですね。
ちなみに、GIVINGの後ろに書く変数(C)が計算結果の置き場所になります。
何回も同じ変数で計算する場合や、途中経過を記録したいときなどに活躍します。
COBOL算術命令SUBTRACTの使い方
理屈はもうバッチリだと思います。そろそろ、実際に動くプログラムを見てみましょう。
コードを手元で動かしてみると、理解がぐんと深まります。計算の流れもイメージしやすくなりますよ。
サンプルプログラム: 基本的な引き算 (SUBTRACT FROM)
まずは、SUBTRACT命令の基本形「FROM」を使ったシンプルなサンプルです。
IDENTIFICATION DIVISION. PROGRAM-ID. SUBTRACT-DEMO-1. DATA DIVISION. WORKING-STORAGE SECTION. 01 NUM1 PIC 9(3) VALUE 15. 01 NUM2 PIC 9(3) VALUE 30. PROCEDURE DIVISION. SUBTRACT NUM1 FROM NUM2. DISPLAY "計算結果(NUM2): " NUM2. STOP RUN.
このプログラムを動かすと、次のような表示になります。
計算結果(NUM2): 015
NUM2の初期値30から、NUM1の値15が引かれて、NUM2の中身が15に変わっています。
サンプルプログラムの解説
プログラムの各部分について、順を追って見ていきましょう。
IDENTIFICATION DIVISIONとPROGRAM-IDは、COBOLプログラムの名前を決める場所です。
DATA DIVISIONには、使う変数を定義しています。NUM1とNUM2は3桁の数値(PIC 9(3))で、初期値をそれぞれ15と30にしています。
SUBTRACT NUM1 FROM NUM2.が主役の1行です。意味は「NUM2 - NUM1を計算して、結果をNUM2に上書きする」です。
DISPLAY命令は、計算後のNUM2の中身を画面に表示する命令です。ピリオドの位置は文の終わりを示すので、忘れずに。
サンプルプログラム: 結果を別変数へ格納 (GIVING)
次は、SUBTRACT命令にGIVINGをつけて、結果を別の変数に入れるパターンです。
IDENTIFICATION DIVISION. PROGRAM-ID. SUBTRACT-DEMO-2. DATA DIVISION. WORKING-STORAGE SECTION. 01 MINUEND PIC 9(3) VALUE 50. 01 SUBTRAHEND PIC 9(3) VALUE 20. 01 RESULT-AREA PIC 9(3) VALUE 0. PROCEDURE DIVISION. SUBTRACT SUBTRAHEND FROM MINUEND GIVING RESULT-AREA. DISPLAY "結果: " RESULT-AREA. DISPLAY "MINUENDの値(変更なし): " MINUEND. STOP RUN.
このプログラムの実行結果は以下のとおりです。
結果: 030 MINUENDの値(変更なし): 050
引き算の結果はRESULT-AREAに入り、MINUENDの値はそのまま残っています。
サンプルプログラムの解説
変数名が少し変わりましたが、基本の流れは同じです。
MINUEND(ミヌエンド)は「引かれる数」、SUBTRAHEND(サブトラヘンド)は「引く数」です。英語っぽいですが、慣れると直感的にわかります。
GIVING RESULT-AREAがポイントです。計算結果だけをRESULT-AREAに渡して、元のMINUENDの値には手をつけません。
DISPLAYで2つの変数を表示することで、「計算結果は別に保管できる」というGIVING構文の特徴がよくわかると思います。
元の値を残しておきたい場合は、迷わずこのパターンを使いましょう。
COBOL算術命令SUBTRACTのオプションと注意点
SUBTRACT命令はシンプルに見えますが、現場で安心して使うにはちょっとした知識が役立ちます。
ここでは、プログラムの安定性を高めるためのON SIZE ERROR句について紹介します。
桁あふれ(オーバーフロー)が起きたとき、知らぬ間に変な値が入っていた…なんてことを防げます。
ON SIZE ERROR句の使い方と桁あふれ対策
COBOLでは、数値の計算結果が変数の桁数を超えると、予期しない値が入ったり、処理が止まったりします。これを桁あふれ(SIZE ERROR)と呼びます。
たとえば、次のような状況を考えてみてください。
01 NUM-A PIC 9(2) VALUE 20. 01 NUM-B PIC 9(2) VALUE 90. SUBTRACT NUM-B FROM NUM-A.
NUM-Aは2桁までしか入らないのに、「20 - 90」だとマイナス70になります。マイナスは入らないので、データが壊れてしまいます。
そこで登場するのが、ON SIZE ERROR句です。
これは、「もし計算結果が入りきらない場合、こういう処理をしてね」とCOBOLに伝える命令です。
実際の書き方を見てみましょう。
SUBTRACT NUM-B FROM NUM-A ON SIZE ERROR DISPLAY "計算エラー: 桁あふれが発生しました".
ON SIZE ERRORのブロック内には、エラーメッセージの表示や、再計算の処理などを書けます。
プログラムを安全に動かすには、この構文を覚えておくとかなり安心です。
「桁あふれなんてめったにないでしょ?」と思いがちですが、実際には思わぬ場面で出てくることがあります。
一行加えるだけでミスを防げるなら、使わない手はありません。
【まとめ】COBOL算術命令SUBTRACTをマスターしよう
ここまでSUBTRACT命令の使い方をたっぷり紹介してきました。最後に、要点だけをサクッと振り返っておきましょう。
- SUBTRACT命令は「引き算」をするための基本命令
- 構文1:SUBTRACT A FROM B → 結果をBに上書き
- 構文2:SUBTRACT A FROM B GIVING C → 結果を別の変数Cに格納
- ON SIZE ERROR句を使えば、桁あふれ時の対策ができる
「SUBTRACTって思ったより奥が深いな」と感じたかもしれません。でも、それだけ現場で使われているということでもあります。
ここまで読んできたなら、もう引き算の達人です。
ADDやMULTIPLYなど、ほかの算術命令にもぜひチャレンジしてみてくださいね。COBOL計算の世界がぐっと広がります。
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。