前回のコードから。
🧩今日の学び
・DIVIDEは単なる割り算ではなく、どの変数に結果を書くかを決める命令である
・GIVINGを使うことで、元データ(B)を壊さずにRESULTへ計算結果を分離できる
・REMAINDERを使えば余りも取得できるが、COBOLの本質は「データを守るかどうか」の設計にある
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....
係)そうだとして、実行して出てくる値はどうなる?
ちょっと修正して実行してみろ。
な)あい
割り算しても小数は出ない理由
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に思いを馳せてギブミーチョコレートとか言ってたやつっすね。
係)言ってねーからな!
RESULTとAMARIが変数だ。ちょっとこれだけ読んでみろ。
な)あい。
GIVINGは出してって意味っすかね。それで、RESULTが割った結果で、…ん?
REMAINDERって余り?になるんすか?AMARIが変数だったから、REMAINDERは余りを出せって命令ってことすかね。
つまり、GIVINGが商を出す、REMAINDERは余りを出す命令句だということかしら?
GIVINGはREMAINDERを出すためだけの句になるんすか?
係)おしいと言える段階だな。
GIVINGは割った商をRESULTに入れろって命令REMAINDERは割った余りをAMARIに入れろって命令
ということだ。
な)ほむぅ。てか、AMARIがなかったらGIVINGいらないんすよね?
係)これだけで終わるならな。
な)へ?どういうことっすか?
係)そこからは考えてみろ。
な)え!?いや、あの…考えろと言われても…何を考えるのさ…
PROCEDURE DIVISION.
DIVIDE A INTO B GIVING RESULT REMAINDER AMARI.
だってBもRESULTも同じ値になるわけでしょー。だったら考える余地なんて無いじゃないの…
…って、あれ?同じ値になるのかな?
さっきは商がBに反映されてB自体が変えられちゃったけど、商がRESULTに入ったら、BはそのままでRESULTだけが変更されるんじゃ?
だったら、Bが違うデータが読み込まれて他の値が指定されたら、RESULTが変更されて、いろいろ違う結果がでてくるってことじゃないのかしら。
あ、やってみれば良いのか。
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は計算より、データを壊すか守るかを先に考える言語だ。


コメント