COBOLのMULTIPLY・DIVIDE文を完全ガイド!初心者でもわかる掛け算と割り算の基本と活用例
生徒
「先生、COBOLで掛け算や割り算をするにはどうすればいいですか?」
先生
「COBOLでは、掛け算にはMULTIPLY文、割り算にはDIVIDE文を使います。英語の単語の意味そのままで、とてもわかりやすいですよ。」
生徒
「なるほど!でも実際にはどんなふうに書くんですか?」
先生
「それでは、COBOLでの掛け算と割り算の基本的な書き方と注意点を、わかりやすく見ていきましょう。」
1. MULTIPLY文とは?掛け算の基本をマスターしよう
COBOLで数値の掛け算(乗算)を行う際に使用するのがMULTIPLY文です。英語の「multiply(掛ける)」という言葉通り、直感的で読みやすい命令文となっています。
プログラミング未経験の方でも、算数の「×(かける)」をMULTIPLYとBYに置き換えるだけと考えれば非常に簡単です。まずは最もシンプルな基本形を見てみましょう。
MULTIPLY 数値1 BY 数値2.
この構文の最大の特徴は、「計算結果が BY の後ろにある変数に上書きされる」という点です。つまり、上記の書き方では「数値2 × 数値1」が計算され、もともと数値2に入っていた値は消えて、計算後の新しい値に書き換わります。
▶ プログラミング初心者向けの簡単な例
例えば、1個120円のリンゴを3個買ったときの合計金額を計算するプログラムを考えてみましょう。未経験の方でも、以下のコードの流れを追うだけで仕組みが理解できるはずです。
IDENTIFICATION DIVISION.
PROGRAM-ID. MULTIPLY-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
* 商品の単価を格納する変数(4桁の数字)
01 PRICE PIC 9(4) VALUE 120.
* 購入個数を格納する変数(3桁の数字)
01 QUANTITY PIC 9(3) VALUE 3.
PROCEDURE DIVISION.
* QUANTITY(3)に PRICE(120)を掛けて、結果をQUANTITYに保存する
MULTIPLY PRICE BY QUANTITY.
DISPLAY "計算が終わりました。"
DISPLAY "掛け算の結果(合計金額)は " QUANTITY " 円です。"
STOP RUN.
計算が終わりました。
掛け算の結果(合計金額)は 360 円です。
【詳しく解説】コードのポイント
- 変数の上書き: この例では
QUANTITY(個数)という変数に、計算結果である 360 が代入されています。元の「3」という数値は消えてしまうため注意が必要です。 - 読みやすさ:
MULTIPLY PRICE BY QUANTITYは英語で「単価によって個数を掛け算する」と読めるため、事務処理の内容がコードから推測しやすくなっています。 - 桁数の定義:
PIC 9(4)は「数字4桁が入る箱」という意味です。計算結果がこの桁数を超えないように設計するのが、COBOLで正しく計算を行うコツです。
このように、単純な掛け算であれば非常に短い記述で処理できるのがMULTIPLY文のメリットです。
2. GIVINGを使って結果を別の変数に入れる
COBOLで計算を行う際、もっとも安全で頻繁に使われるのがこのGIVING(ギビング)句を使った書き方です。英語の「Give(与える)」の通り、計算した結果を特定の変数に「渡してあげる」イメージです。
最大の特徴は、計算に使った元の数値(変数)を壊さずに、結果だけを新しい箱に保存できる点にあります。これはデータの正確性が求められる事務処理計算において、非常に重要なポイントです。
MULTIPLY 数値1 BY 数値2 GIVING 結果を格納する変数.
▶ 実際の例:お買い物計算
例えば、150円のお菓子を2個買ったときの「合計金額」を計算してみましょう。未経験の方でも分かりやすいように、身近な言葉を変数名にしています。
IDENTIFICATION DIVISION.
PROGRAM-ID. MULTIPLY-GIVING-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
* 単価をいれる変数(4桁)
01 TANKA PIC 9(4) VALUE 150.
* 個数をいれる変数(3桁)
01 KOSU PIC 9(3) VALUE 2.
* 計算結果をいれる専用の変数(5桁)
01 GOUKEI PIC 9(5) VALUE 0.
PROCEDURE DIVISION.
* TANKAとKOSUを掛けた結果をGOUKEIに代入します
MULTIPLY TANKA BY KOSU GIVING GOUKEI.
DISPLAY "単価:" TANKA "円"
DISPLAY "個数:" KOSU "個"
DISPLAY "--------------------"
DISPLAY "合計金額は " GOUKEI " 円です。"
STOP RUN.
実行結果
単価:0150円
個数:002個
--------------------
合計金額は 00300 円です。
▶ なぜ GIVING を使うのが「おすすめ」なの?
プログラミングの世界では、一度使った数値を後から別の計算で再利用することがよくあります。GIVINGを使わない場合、元の変数の値が書き換わってしまうことがありますが、GIVINGを使えば「元の値(単価や個数)」をそのまま保持したまま、「新しい値(合計)」を作成できます。
このように、計算の「入力」と「出力」を明確に分ける書き方は、プログラムのバグを防ぐための基本であり、現場のエンジニアも推奨する「安全なコード」の第一歩です。
3. DIVIDE文とは?割り算の基本と書き方をマスターしよう
次に、COBOLで「割り算」を行うためのDIVIDE文を解説します。英語の「divide(分割する・割る)」という言葉の通り、計算機としての基本機能の一つです。
COBOLの割り算にはいくつかの書き方がありますが、まずは最もシンプルでよく使われる「INTO」を使った基本形を覚えましょう。
DIVIDE A INTO B.(B ÷ A の計算が行われ、結果はBに上書きされます)
プログラミング未経験の方が一番間違いやすいポイントは、「どっちの数字が割られる数なのか」という語順です。INTOの前に置いた数値(割る数)で、後ろの数値(割られる数)を割るというルールになっています。算数の式とは順番が逆に見えることもあるので、注意して確認しましょう。
▶ 初心者向けの簡単なサンプルコード
実際に、合計金額を人数で割る「1人あたりの計算」を例に、プログラムの書き方を見てみましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. DIVIDE-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
* 合計金額(割られる数)
01 TOTAL-AMOUNT PIC 9(4) VALUE 1000.
* 人数(割る数)
01 NUM-PEOPLE PIC 9(2) VALUE 5.
PROCEDURE DIVISION.
* 1000 ÷ 5 を計算して、結果をTOTAL-AMOUNTに格納します
DIVIDE NUM-PEOPLE INTO TOTAL-AMOUNT.
DISPLAY "計算結果を表示します。"
DISPLAY "一人あたりの金額は " TOTAL-AMOUNT " 円です。"
STOP RUN.
▶ 実行結果
計算結果を表示します。
一人あたりの金額は 0200 円です。
▶ 詳しく解説:ここがポイント!
- 数値の入れ替わりに注意: 上記の例では、
TOTAL-AMOUNTの中身が計算結果の「200」に書き換わります。元の「1000」という数値は消えてしまうため、元の値を残しておきたい場合は、別の項目に結果を入れる書き方(GIVINGなど)を使いますが、まずはこの基本形をしっかり身につけましょう。 - 桁あふれに注意: 計算結果が定義した桁数(今回の場合は
9(4))を超えてしまうと、正しい値が表示されません。割り算の結果がどれくらいの大きさになるか予想して、変数のサイズを決めるのがSEO(正確な演算)のコツです。
このように、DIVIDE文はビジネスシーンでの「平均出し」や「在庫の割り振り」などで非常によく使われる命令です。
4. DIVIDE文のGIVING句で計算結果をスマートに取得する方法
COBOLで割り算を行う際、最も実務で使われるのがこのGIVING句(ギビング句)を使った書き方です。前述の単純なDIVIDE文では計算の受け皿となる変数の値が上書きされてしまいましたが、GIVINGを使うことで元の値を残したまま、計算結果だけを別の変数に格納できます。これにより、プログラムの可読性と安全性が一気に高まります。
基本の書き方は2パターンあります。初心者の方は、英語の語順として自然な「BY」を使った形から覚えるのがおすすめです。
① INTOを使う場合(数値2 ÷ 数値1)
DIVIDE 数値1 INTO 数値2 GIVING 結果格納用変数.
② BYを使う場合(数値1 ÷ 数値2)
DIVIDE 数値1 BY 数値2 GIVING 結果格納用変数.
実務では、BYを使うと「AをBで割る」という直感的な流れになるため、計算ミスを防ぐことができます。プログラミング未経験の方は、まず「割られる数 BY 割る数 GIVING 答え」というリズムで覚えましょう。
▶ 実際の活用例:割り勘の計算プログラム
例えば、合計金額を人数で割って、一人当たりの支払額を算出するプログラムを考えてみましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. DIVIDE-GIVING-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 TOTAL-AMT PIC 9(5) VALUE 12000. *> 合計金額(12,000円)
01 PERSON-CNT PIC 9(2) VALUE 3. *> 人数(3人)
01 PER-EACH PIC 9(5). *> 一人当たりの結果用
PROCEDURE DIVISION.
* TOTAL-AMT(12000) を PERSON-CNT(3) で割り、結果を PER-EACH に入れる
DIVIDE TOTAL-AMT BY PERSON-CNT GIVING PER-EACH.
DISPLAY "【計算結果】"
DISPLAY "合計金額:" TOTAL-AMT "円"
DISPLAY "参加人数:" PERSON-CNT "人"
DISPLAY "一人あたり " PER-EACH " 円です。"
STOP RUN.
実行結果
【計算結果】
合計金額:12000円
参加人数:03人
一人あたり 04000 円です。
このように、GIVING句を使えば、元の「合計金額(TOTAL-AMT)」や「人数(PERSON-CNT)」のデータはそのまま保持されるため、後続の処理でこれらの値を再利用したい場合に非常に便利です。また、変数名を工夫することで、誰が見ても計算内容が一目で理解できるメンテナンス性の高いコードになります。
5. 割り算の余りを求める(REMAINDER)
プログラミングをしていると、「10個のリンゴを3人で分けたら、何個余る?」といった、割り切れない計算の結果(余り)が必要になる場面がよくあります。COBOLでは、REMAINDER句を使うことで、割り算の「商(答え)」と「余り」をセットで算出できます。
事務処理や在庫管理システムにおいて、端数の計算や入庫単位の算出など、実務でも非常に頻繁に利用される重要な構文です。基本の書き方は以下の通りです。
DIVIDE 数値1 BY 数値2 GIVING 商を格納する変数 REMAINDER 余りを格納する変数.
▶ 初心者向けの具体例:お菓子を配る計算
プログラミング未経験の方でもイメージしやすいよう、103個の品物を10人で分けるケースを想定したサンプルプログラムを見てみましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. DIVIDE-REMAINDER.
DATA DIVISION.
WORKING-STORAGE SECTION.
* 全体の数(3桁)
01 TOTAL-ITEMS PIC 9(3) VALUE 103.
* 分ける人数(2桁)
01 PEOPLE-COUNT PIC 9(2) VALUE 10.
* 1人あたりの数(商)
01 ANS-QUOTIENT PIC 9(3).
* 残りの数(余り)
01 ANS-REMAINDER PIC 9(2).
PROCEDURE DIVISION.
* TOTAL-ITEMS を PEOPLE-COUNT で割り、商を ANS-QUOTIENT に、余りを ANS-REMAINDER に格納
DIVIDE TOTAL-ITEMS BY PEOPLE-COUNT
GIVING ANS-QUOTIENT
REMAINDER ANS-REMAINDER.
DISPLAY "一人あたり " ANS-QUOTIENT " 個配ります。"
DISPLAY "配りきれなかった余りは " ANS-REMAINDER " 個です。"
STOP RUN.
▶ 実行結果
一人あたり 10 個配ります。
配りきれなかった余りは 03 個です。
▶ ここがポイント!
- 変数の準備: 「商」を受け取る変数(GIVING)と「余り」を受け取る変数(REMAINDER)の2つをあらかじめ定義しておく必要があります。
- 実務での活用: 「余りが0なら割り切れた(偶数・奇数の判定など)」という判断ロジックにもよく使われます。
- 読みやすさ: COBOLは英語に近い構造のため、
REMAINDER(残り)という単語を知っていれば、コードを見ただけで何をしているか一目で理解できるのがメリットです。
このように、一つの命令で「計算結果」と「端数」を同時に整理できるため、複雑な計算式を自作する必要がなく、初心者でもミスなく正確な計算処理が実装可能です。
6. MULTIPLY・DIVIDE文を使うときの注意点
COBOLの数値演算は非常に厳密に管理されています。いくつかの注意点を覚えておきましょう。
① 桁あふれ(オーバーフロー)に注意
結果が変数に入りきらない場合、値が壊れたり、プログラムがエラーになることがあります。PIC句の桁数を十分に確保しておきましょう。
② 小数点を扱うときはVを使う
金額や割合など小数を使いたい場合は、Vを使って小数点位置を定義します。
01 PRICE PIC 9(3)V9(2) VALUE 12.50.
01 TAX PIC 9(2)V9(2) VALUE 1.08.
01 RESULT PIC 9(4)V9(2).
MULTIPLY PRICE BY TAX GIVING RESULT.
これで「12.50 × 1.08 = 13.50」のような小数計算も正しく行えます。
③ INTOとBYを混同しない
DIVIDE文では、「INTO」と「BY」で計算の方向が変わります。INTOは「割られる数 ÷ 割る数」、BYは「割る数 ÷ 割られる数」になります。混同すると結果が全く違ってしまいます。
④ GIVINGを使って安全に結果を保存
元の値を残したいときは、GIVINGで結果を別の変数に入れるようにしましょう。業務プログラムでは、データを壊さない設計がとても大切です。
7. 実務での活用例
MULTIPLYとDIVIDEは、売上計算・平均値計算・税金の計算などで頻繁に使われます。たとえば「商品の単価×数量=合計金額」「合計÷人数=一人あたり金額」など、日常の計算をそのままプログラムに書けるのがCOBOLの魅力です。
また、COBOLは金融システムや給与計算システムなど、数値の正確さが求められる分野で長く使われてきた言語です。だからこそ、MULTIPLYやDIVIDEのような数値演算をしっかり理解することが、COBOLを使いこなす第一歩になります。
まとめ
ここまで、COBOLにおける算術演算の要であるMULTIPLY文(掛け算)とDIVIDE文(割り算)について詳しく解説してきました。COBOLは事務処理計算に特化した設計思想を持っているため、数式を記号(* や /)で書くよりも、英語の構文に近い形で記述するこれらの命令文が非常に重宝されます。特に金融や流通の基幹システムでは、可読性が高く、誰が見ても「何を計算しているのか」が一目でわかるコードが求められるため、MULTIPLYやDIVIDEの使いこなしは必須スキルと言えるでしょう。
今回の学習で最も重要なポイントは、「データの整合性をどう保つか」という点です。COBOLプログラミングにおいては、単に計算結果を出すだけでなく、GIVING句を活用して元の数値を破壊せずに結果を別変数へ格納する手法や、REMAINDER句によって割り算の余りを正確に把握するテクニックが実務レベルでは頻繁に登場します。また、計算対象となる変数の桁数(PIC句)の定義が、そのまま計算精度やエラー(桁あふれ)の防止に直結するというCOBOL特有の厳密さも理解できたのではないでしょうか。
▶ 応用:C#での計算処理との比較
現代的なオブジェクト指向言語であるC#と比較すると、COBOLの記述がいかに文法的であるかがよくわかります。参考までに、同様の計算をC#で行う場合の基本的な実装例を見てみましょう。C#では演算子(* や /)を使用するのが一般的ですが、事務計算などで精度を保つためにはdecimal型を使用するのがセオリーです。
using System;
public class CalculationSummary
{
public static void Main()
{
// 変数の定義
decimal price = 150m;
decimal quantity = 2m;
decimal total = 0m;
// 掛け算の実行(COBOLのMULTIPLY相当)
total = price * quantity;
Console.WriteLine($"合計金額(掛け算): {total} 円");
// 割り算の実行(COBOLのDIVIDE相当)
decimal dividend = 500m;
decimal divisor = 4m;
decimal quotient = dividend / divisor;
Console.WriteLine($"一人あたり(割り算): {quotient} 円");
// 余りの計算
int totalItems = 103;
int people = 10;
int rem = totalItems % people;
int perPerson = totalItems / people;
Console.WriteLine($"{perPerson}個ずつ配り、余りは{rem}個です。");
}
}
実行結果は以下のようになります。
合計金額(掛け算): 300 円
一人あたり(割り算): 125 円
10個ずつ配り、余りは3個です。
C#では記号を使って簡潔に書けますが、COBOLのMULTIPLYやDIVIDEは、文章を読むようにロジックを追えるというメリットがあります。これは大規模な保守開発において、仕様書とコードの乖離を防ぐ大きな助けとなります。
▶ 実務で役立つCOBOL算術演算のチェックリスト
最後に、実務でプログラムを書く際に振り返るべきチェックポイントを整理しました。
- 受け皿となる変数の桁数は足りているか: 1,000 × 1,000の結果を格納するには、少なくとも
PIC 9(7)以上の定義が必要です。 - 四捨五入(ROUNDED)の必要性: 今回は触れませんでしたが、実務では
MULTIPLY ... GIVING ... ROUNDEDのように、端数処理を自動で行う指定が必要な場面が多くあります。 - ゼロ除算の回避:
DIVIDEを使う際は、割る数がゼロにならないよう、事前にIF文でチェックする癖をつけましょう。 - 符号の扱い: マイナスの値を扱う場合は、定義に
S(SIGN)がついているか確認してください。
これらの基本を忠実に守ることで、バグの少ない、信頼性の高いシステムを構築することができます。COBOLの計算命令はシンプルですが、その奥には「正確な事務計算を支える」という誇り高い哲学が流れています。
生徒
「先生、ありがとうございました!MULTIPLYとDIVIDEの使い方、バッチリ分かりました。特にINTOとBYの違いで割る順番が変わるっていうのは、最初は少し混乱しそうでしたが、英語の文章として考えれば自然ですね。」
先生
「その通りです。COBOLは『コモン・ビジネス・オリエンテッド・ランゲージ』の名前通り、ビジネス上の処理を誰もが読みやすいように作られています。だから、数学の式として覚えるよりも、命令文を音読して意味が通じるか確認するのが上達のコツですよ。」
生徒
「なるほど。あと、GIVINGを使うのが推奨される理由もよく分かりました。元のデータをうっかり書き換えてしまうと、後の処理で計算が合わなくなって大変なことになりますもんね。銀行のシステムとかだったら大問題です!」
先生
「鋭いですね。実務では『不変性』、つまり元のデータを守ることが非常に重視されます。また、桁あふれについても注意が必要です。例えば、給与計算で端数が出てしまったときに、それを切り捨てるのか、四捨五入するのかといった細かい仕様も、COBOLなら確実に制御できます。」
生徒
「そういえば、余りを求めるREMAINDERも便利そうですね。在庫管理とかで、ケース単位の出荷とバラの余りを計算する時に使えそうです。」
先生
「その通り!まさに現場で使われている発想です。COBOLは古い言語だと言われることもありますが、こうした数値計算の正確さと安定性は、最新の言語にも負けません。基礎をしっかり固めて、次のステップである条件分岐や繰り返し処理にも挑戦していきましょう。」
生徒
「はい!計算ができるようになると、作れるプログラムの幅が一気に広がってワクワクします。もっと色んな計算パターンを試してみますね!」