【COBOL 書き1-6-2】DIVIDE GIVING REMAINDERで商と余りを管理する!〜守るべきものたち

前回のコードから。

🧩今日の学び
DIVIDEは単なる割り算ではなく、どの変数に結果を書くかを決める命令である
GIVINGを使うことで、元データ(B)を壊さずにRESULTへ計算結果を分離できる
REMAINDERを使えば余りも取得できるが、COBOLの本質は「データを守るかどうか」の設計にある

📝 COBOL wari-test.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. WARI-TEST.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 A PIC 9(3) VALUE 2.
01 B PIC 9(3) VALUE 10.

PROCEDURE DIVISION.
    DIVIDE A INTO B.
    DISPLAY B.
    STOP RUN.

係)よし、前もやったが、これを計算したらどうなる?

💡 ポイント
A = 3
B = 10

な)えーと、こういうことですか?

💡 ポイント
3.3333....

係)そうだとして、実行して出てくる値はどうなる?

ちょっと修正して実行してみろ。

な)あい

割り算しても小数は出ない理由

📝 COBOL wari-test.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. WARI-TEST.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 A PIC 9(3) VALUE 3.
01 B PIC 9(3) VALUE 10.

PROCEDURE DIVISION.
    DIVIDE A INTO B.
    DISPLAY B.
    STOP RUN.
💻 ターミナル出力 実行結果
003

あれ、小数点以下がないっす。丸め込まれちゃいました。壺とか買わされそうですね…。

係)どういう意味だよ…

PIC 9(3)には小数の枠がないからな、小数点以下は消えたってことだ。

な)ふむふむ。

係)いいか、もう一段あったの覚えてるか、余りを取るやりかただ。

な)ふみ…

REMAINDERで「余り」を取り出す

係)それがこれだ。

💡 ポイント
DIVIDE A INTO B GIVING RESULT REMAINDER AMARI.

な)なんかあったような、GHQに思いを馳せてギブミーチョコレートとか言ってたやつっすね。

係)言ってねーからな!

RESULTAMARIが変数だ。ちょっとこれだけ読んでみろ。

な)あい。

GIVINGは出してって意味っすかね。それで、RESULTが割った結果で、…ん?

REMAINDERって余り?になるんすか?
AMARIが変数だったから、REMAINDERは余りを出せって命令ってことすかね。

つまり、GIVINGが商を出す、REMAINDERは余りを出す命令句だということかしら?

GIVINGREMAINDERを出すためだけの句になるんすか?

係)おしいと言える段階だな。

GIVINGは割った商をRESULTに入れろって命令
REMAINDERは割った余りをAMARIに入れろって命令

ということだ。

な)ほむぅ。てか、AMARIがなかったらGIVINGいらないんすよね?

係)これだけで終わるならな。

な)へ?どういうことっすか?

係)そこからは考えてみろ。

な)え!?いや、あの…考えろと言われても…何を考えるのさ…

📝 COBOL wari-test.cob
PROCEDURE DIVISION.
    DIVIDE A INTO B GIVING RESULT REMAINDER AMARI.

だってBもRESULTも同じ値になるわけでしょー。だったら考える余地なんて無いじゃないの…

…って、あれ?同じ値になるのかな?

さっきは商がBに反映されてB自体が変えられちゃったけど、商がRESULTに入ったら、BはそのままでRESULTだけが変更されるんじゃ?

だったら、Bが違うデータが読み込まれて他の値が指定されたら、RESULTが変更されて、いろいろ違う結果がでてくるってことじゃないのかしら。

あ、やってみれば良いのか。

📝 COBOL wari-test.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. WARI-TEST.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 A PIC 9(3) VALUE 3.
01 B PIC 9(3) VALUE 10.
01 RESULT PIC 9(3).
01 AMARI PIC 9(3).

PROCEDURE DIVISION.
    DIVIDE A INTO B GIVING RESULT REMAINDER AMARI.
    DISPLAY B.
    DISPLAY RESULT.
    DISPLAY AMARI.
    STOP RUN.

と直して、実行と…あ、出た!

💻 ターミナル出力 実行結果
010
003
001

やっぱ、Bは変わらないんだ。

ってことはAMARIがなくてもGIVINGを使う理由はあるってことになるよね。

てか、AMARIって短絡的すぎない?

係)うるせーよ!

とにかく、そこまでたどり着いたことで、合格ラインとしておくぞ。

GIVINGは「元データを守る」ためにある

つまり、GIVINGがあるとBは守られるというわけであって、いわば、RESULTは計算結果の保管場所で、Bは元データだな。

分ける理由としては、

・元データを壊さない

・結果を別用途に使える
 表示用、計算用、ログ用など

・バグ防止
 上書き事故防げる

結果より元データの方が大事な時もあるからな。

な)はー、守るべきものがあるわけっすね。

係)まぁ、そういうことだな。

おむすび

な)係長も守るべき人がいるっすよね。

係)はぁ?何の話だよ…

な)え、いないすか?

係)そら、まぁ…、いるに決まってるだろ。

な)そっすよね。

奥さんとか、娘さんとか、わんことか、キャバ嬢とか、愛人とか…

係)お前本当に反省してんのか!?

係長のワンポイント

DIVIDEは「割る命令」じゃない、どこに結果を書くかを決める命令だ。
GIVINGを使うと、結果はRESULTに入り、Bはそのまま残る。
つまり、計算するか守るかを選べるのがCOBOLの設計だ。
REMAINDERは余りを取り出すが、主役はあくまで「書き込み先」だ。
COBOLは計算より、データを壊すか守るかを先に考える言語だ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA