「MULTIPLYってどう書くんだっけ?」と手が止まったこと、ありませんか?
COBOLで掛け算をする命令――MULTIPLY。一見シンプルなようで、GIVING句、ROUNDED、ON SIZE ERRORといったオプションが登場すると、一気に混乱してしまうこともありますよね。
そんなあなたのために、この記事ではCOBOLのMULTIPLY命令について、最初の一歩から応用テクニックまで、やさしくていねいに解説します。
思わず「なるほど!」とうなずける実例付き。ちょっとニヤッとできるネタも交えながら、楽しく学んでいきましょう。
この記事でわかること
・COBOLのMULTIPLY命令の基本構文と使い方
・GIVING句を使った結果の格納方法
・ROUNDEDでの端数処理の意味と使いどころ
・ON SIZE ERRORによるエラー処理の考え方
・初心者でも理解しやすいサンプルコード付き
COBOL算術命令MULTIPLYとは?
COBOLの世界にも、「足し算」「引き算」「掛け算」「割り算」があります。中でも掛け算をする命令が MULTIPLY です。
たとえば、「商品1個の値段 × 個数」で合計金額を出すとき。あるいは「時給 × 勤務時間」で給料を計算したいとき。そんなときにMULTIPLY命令が活躍します。
慣れないうちは、「えっ、BYって何?」「結果はどこに入るの?」と混乱するかもしれません。でも安心してください。この記事では、MULTIPLY命令の基本から、ちょっと気になる疑問まで、すっきり理解できるように解説しています。
記事を読み進めると、以下のようなことが分かるようになります。
- MULTIPLY命令の意味と使い方
- 「GIVING句」や「ROUNDED」の正しい使い方
- 計算結果を安全に扱うための工夫
- 実際に動くCOBOLのサンプルコード
途中で「あっ、これ知りたかったやつ!」となる部分が、きっと見つかるはずです。
COBOL算術命令MULTIPLYの基本的な使い方(構文1)
MULTIPLY命令の最もシンプルな書き方が、次の構文です。
MULTIPLY 掛けられる数 BY 掛ける数.
たとえば「AにBを掛ける」なら、Aが掛けられる数(被乗数)、Bが掛ける数(乗数)です。
ちょっとややこしいのは、この構文では「掛ける数」に結果が上書きされること。
イメージを図で表すと、こうなります。
(例) A = 3 B = 4 MULTIPLY A BY B. 実行後: B = 12(←元の4は消える)
「あれ?Bって上書きされるの?」と思った方。そうなんです。次でこの点をもう少し詳しく見ていきましょう。
構文1の注意点:結果の格納先
基本構文でMULTIPLYを使うと、結果は「掛ける数(BYの後ろ)」に自動的に上書きされます。
たとえば、こんなコードがあったとします。
01 A PIC 9(3) VALUE 5. 01 B PIC 9(3) VALUE 2. MULTIPLY A BY B.
この実行後、Bは10になります。最初に入っていた「2」は跡形もなく消えてしまうんです。
うっかり大事な値を上書きしてしまわないように、注意が必要です。もし「結果は別の場所に入れたい」と思ったら、GIVING句を使った構文が便利です。
COBOL算術命令MULTIPLYの基本的な使い方(構文2:GIVING)
「計算結果は別の項目に入れておきたい」そんなときに使えるのが、GIVING句です。
GIVINGを使う構文は、次のようになります。
MULTIPLY 掛けられる数 BY 掛ける数 GIVING 結果を入れたい場所.
さっきの例でいうと、AにBを掛けて、その結果をCに入れたい場合はこう書きます。
01 A PIC 9(3) VALUE 5. 01 B PIC 9(3) VALUE 2. 01 C PIC 9(4). MULTIPLY A BY B GIVING C.
実行後、AとBはそのままで、Cに10が入ります。元のデータを壊さずに済むのがGIVING句の良いところです。
構文1との違いが分かると、使い分けもバッチリですね。
GIVING句を使うメリット
GIVING句を使うと、次のような便利な点があります。
- 計算結果を別の変数に保存できる
- 元の値をそのまま残せる
- あとから計算結果だけ使いたいときに便利
- プログラムの流れが見やすくなる
ちょっとした工夫で、バグや混乱を防ぎやすくなるんです。
計算のたびに変数が書き変わると、あとで追いかけるのが大変です。GIVINGをうまく使えば、気持ちよくプログラムが書けます。
COBOL算術命令MULTIPLYを使いこなす応用テクニック
基本を押さえたら、次は応用テクニックを学びましょう!
掛け算といっても、実務では「ちょっとの誤差」や「桁数オーバー」で思わぬミスが起きがちです。たとえば金額を四捨五入したい場面や、計算結果が大きくなりすぎて入らない場合など。
そんな時に便利なのが、ROUNDED句とON SIZE ERROR句です。
このセクションでは、計算の精度を保ちつつ、エラーにも強いプログラムを作るためのコツを解説していきます。
端数処理の味方!ROUNDED句の使い方
たとえば「1.5 × 3 = 4.5」を整数として扱いたいとき。0.5をどう処理するかが大事ですよね。
そんな時に使えるのがROUNDED句です。
ROUNDED句は、計算結果に小数点以下の端数が出た場合に、第一位を四捨五入して処理してくれます。
MULTIPLY 掛けられる数 BY 掛ける数 GIVING 結果格納項目 ROUNDED.
では、ROUNDED句あり・なしで何が変わるのか、サンプルで確認してみましょう。
01 A PIC 9V9 VALUE 1.5. 01 B PIC 9(1) VALUE 3. 01 C1 PIC 9(2). 01 C2 PIC 9(2). MULTIPLY A BY B GIVING C1. MULTIPLY A BY B GIVING C2 ROUNDED.
この場合の結果はこうなります。
- C1 → 4(小数点以下は切り捨て)
- C2 → 5(ROUNDEDで四捨五入)
金額計算などでは1円の差が大きくなることもあるので、ROUNDED句はかなり役立ちます。
桁あふれを防ぐ!ON SIZE ERROR句の使い方
「1000 × 9999」とか、ちょっと大きな数字を掛け算したら、結果が入りきらなくなった…そんな経験ありませんか?
結果格納項目の桁数を超えると、プログラムがうまく動かなくなることもあります。
その対策がON SIZE ERROR句です。
MULTIPLY 掛けられる数 BY 掛ける数 GIVING 結果格納項目 ON SIZE ERROR エラー時の処理.
たとえば、次のように使います。
01 A PIC 9(4) VALUE 1000. 01 B PIC 9(4) VALUE 9999. 01 C PIC 9(4). MULTIPLY A BY B GIVING C ON SIZE ERROR DISPLAY "桁あふれが発生しました".
この場合、Cは4桁なので、結果(9999000)が入りません。
ON SIZE ERROR句をつけておけば、エラーに気づかず進んでしまう心配もなくなります。
ついでに紹介しておくと、NOT ON SIZE ERRORという句もあります。これは「桁あふれが起きなかったときの処理」を指定するものです。
ON SIZE ERROR DISPLAY "エラー発生!" NOT ON SIZE ERROR DISPLAY "計算成功!".
うまく使い分ければ、プログラムの信頼性がグッと上がります。
COBOL算術命令MULTIPLYのサンプルプログラム
ここまで読んで「なんとなく分かった気がするけど、実際に動かしてみないと不安…」という方も多いと思います。
というわけで、MULTIPLY命令の基本から応用までをまとめたサンプルプログラムを紹介します。
そのままコピー&ペーストで動かせる内容なので、ぜひ手元の環境で実行して確認してみてください。
サンプルコード紹介
IDENTIFICATION DIVISION. PROGRAM-ID. MULTIPLY-SAMPLE. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 NUM-A PIC 9(3) VALUE 10. 01 NUM-B PIC 9(3) VALUE 5. 01 RESULT-1 PIC 9(4). 01 RESULT-2 PIC 9(4). 01 RESULT-3 PIC 9(4). 01 LARGE-NUM PIC 9(3) VALUE 999. 01 TOO-SMALL-FIELD PIC 9(3). 01 MSG-TEXT PIC X(40). PROCEDURE DIVISION. *> 構文1:MULTIPLY A BY B(結果はBに上書き) DISPLAY "<構文1:結果がNUM-Bに上書き>". MOVE 5 TO NUM-B. MULTIPLY NUM-A BY NUM-B. DISPLAY "NUM-B = " NUM-B. *> 構文2:GIVING句(結果を別の場所に格納) DISPLAY "<構文2:GIVING句を使ってRESULT-1に格納>". MULTIPLY NUM-A BY 3 GIVING RESULT-1. DISPLAY "RESULT-1 = " RESULT-1. *> ROUNDED句の使用 DISPLAY "<ROUNDEDを使った四捨五入の例>". MULTIPLY 7 BY 2 GIVING RESULT-2 ROUNDED. DISPLAY "RESULT-2 = " RESULT-2. *> ON SIZE ERROR句の使用 DISPLAY "<ON SIZE ERRORを使って桁あふれ対策>". MULTIPLY LARGE-NUM BY 9 GIVING TOO-SMALL-FIELD ON SIZE ERROR MOVE "桁あふれ発生!" TO MSG-TEXT DISPLAY MSG-TEXT NOT ON SIZE ERROR MOVE "計算成功!" TO MSG-TEXT DISPLAY MSG-TEXT. STOP RUN.
実行結果
<構文1:結果がNUM-Bに上書き> NUM-B = 50 <構文2:GIVING句を使ってRESULT-1に格納> RESULT-1 = 30 <ROUNDEDを使った四捨五入の例> RESULT-2 = 14 <ON SIZE ERRORを使って桁あふれ対策> 桁あふれ発生!
このような結果が表示されれば正常に動作しています。
それぞれのDISPLAY文に対応して、掛け算の処理結果やエラー時のメッセージが順番に表示されます。
サンプルコード解説
修正済みのコードは、MULTIPLY命令の基本構文から応用機能まで網羅した構成になっています。
- NUM-A / NUM-B:掛け算に使う2つの基本変数(ともに3桁)
- RESULT-1 / RESULT-2 / RESULT-3:計算結果を格納する項目(4桁で余裕あり)
- LARGE-NUM:わざと大きな値を掛けて桁あふれを発生させる用の値(999)
- TOO-SMALL-FIELD:3桁しかないため、桁あふれの影響を受けやすい
- MSG-TEXT:DISPLAY文で表示する文字列を一時的に入れる領域
では、各MULTIPLY命令の動作を順に見ていきましょう。
① MULTIPLY NUM-A BY NUM-B
5 × 10 = 50 が計算され、NUM-Bの中身が上書きされます。元の値(5)は消えるので注意が必要です。
② MULTIPLY NUM-A BY 3 GIVING RESULT-1
NUM-Aは10なので、10 × 3 = 30 が計算され、結果がRESULT-1に格納されます。元のNUM-AやNUM-Bは変更されません。
③ MULTIPLY 7 BY 2 GIVING RESULT-2 ROUNDED
7 × 2 = 14 なので、四捨五入しても結果は同じですが、ROUNDED句があることで端数処理も安心です。例として小数を使う場合は、ROUNDEDが特に効果を発揮します。
④ ON SIZE ERRORの処理
999 × 9 = 8991 は、TOO-SMALL-FIELD(3桁)には入りません。ON SIZE ERROR句によってMSG-TEXTに「桁あふれ発生!」が入り、DISPLAYされます。NOT ON SIZE ERRORでは「計算成功!」が表示される想定です。
MSG-TEXTという変数名に変更したことで、構文エラーを回避できるようになりました。
全体として、COBOLのMULTIPLY命令を活用する上で、データの格納先や桁数制限、ROUNDED処理などを意識することがとても大事になります。
まとめ
ここまでで、MULTIPLY命令の基本と応用をマスターできましたね。
ポイントを整理すると、次のようになります。
- MULTIPLY A BY B:結果はBに上書き
- MULTIPLY A BY B GIVING C:結果を別の変数に保存できる
- ROUNDED句:四捨五入して精度を保てる
- ON SIZE ERROR句:桁あふれの対策に使える
これでMULTIPLY命令はバッチリですね!
ほかの算術命令(ADDやSUBTRACT)にも挑戦して、COBOLをもっと使いこなしていきましょう!
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。