【COBOL 書き1-3】引き算だけで大騒ぎ

🧩今日の学び
・COBOLの引き算はSUBTRACT A FROM BB = B − Aの意味になる
・COBOLにはExcelのようなセルはなく、ACCEPTで入力値を受け取る必要がある
・GnuCOBOLでは日本語文字列により文字コード警告が出ることがあるが、実行自体は可能な場合が多い

な)足し算ってあんな感じなんすね…もういいっすよね、腹八分目が人間最強ですもんね、おつかれっすー。

係)なんで帰ろうとしてるんだよ!まだ勤務時間だろ!お前のハラなら三分目だろ!

な)俺少食なんで…

係)嘘つくな!カツカレー大盛りとラーメン食ってたんだろ。

な)なんで知ってるんす!?やばい超能力あります!?

係)うるさいな、お前の食う量おかしいだろって話があったんだよ!

な)え…、俺…、そんなにみんなの注目の的…?すごい…?

係)すごくねーからな!いいから座れ!次は引き算だぞ。

な)いやん…

COBOLの四則演算はこの4つ

係)いいか、COBOLはな、四則演算全部あるんだぞ。

な)え、そうなんすか。

係)基本はこれだ

💡 ポイント
ADD
SUBTRACT
MULTIPLY
DIVIDE

な)でも、おれ、登り詰める男だから、引くとか割るとか無いっすから!常に上昇!増え続けますよ!

係)お前の体重の話はどうでもいいんだよ。

な)あ、でも常に燃え続ける男でもあるから、燃えて減っていくんすかね?人生って難しいっすね…。

係)知るかよ!

さっきの足し算はこうだったな。

📝 COBOL subtract_test.cob
ADD A TO B

そして、意味はこうだ。

💡 ポイント
B = B + A

な)もうバッチリングです。

係)… 引き算はこうだ。

📝 COBOL subtract_test.cob
SUBTRACT A FROM B

な)えーとBからAを引くとBはどうなるってことっすよね。

係)だったらどうなる?

な)んーと、こうです?

💡 ポイント
B = B - A

係)いいな。

な)おー!完璧すぎますよね!

引き算は「FROMの向き事故」に注意

係)… やりがちなミスとしてはこうだな。

📝 COBOL subtract_test.cob
SUBTRACT B FROM A

もちろん意味はこうだ

💡 ポイント
A = A - B

な)ぎゃくてにんぐ!

係)… COBOLではFROMの向き事故がよく起きるから気をつけろよ。

な)あいさー!

係)そして、お前が書いたコードに変数を入れ込むとしたらこうなるな。

📝 COBOL subtract_test.cob
01 A PIC 9(3).
01 B PIC 9(3).

SUBTRACT A FROM B.

な)あー、俺の活躍の印が!!

係)その活躍したヒーローさんに聞くが、その値はどこから来るんだ?

COBOLにはセルがない、値は入力する

な)へ?どこって…そら…スポーンしてくるんじゃないすか…ゾンビみたいに。

係)Excelなら簡単だな?セルに書けばいいんだからな。

⏩️ メモ
A1 = 5
A2 = 3

な)あ、スルーっすね…、聞いたの係長ですからね…

係)だがCOBOLにはセルはない。

な)そらないっすよね?

はっ!実はあるとか!?

係)入力するんだよ。

な)やっぱりある!?

ACCEPTで入力して計算する

係)ターミナルから入力できるようにするんだよ。

な)へ?A =5とか書くと勝手に入れてくれるとか?

係)そうじゃなく、コードの中にこう書いておくんだ。

📝 COBOL subtract_test.cob
ACCEPT A.
ACCEPT B.

ターミナルからの入力した値をCOBOLで値を受け取るように書いておく必要があるというわけだ。

な)ほー

係)そして結果を見るにはこうだったな。

📝 COBOL subtract_test.cob
DISPLAY B.

な)これは知ってる!

係)流れを言うからかいてみろ。

💡 ポイント
Aの値をうけとる準備
Bの値を受け取る準備
BからAを引く
Bの結果表示

このコードを書け。

な)え…、そんなマサチューセッツ工科大学的な問題出されても…。あ、マサチューセッツって言えます?

やっぱ「マサチューセッチュッ♡」って言っちゃいますよねー。

係)言わないから早くやれ。

な)ぐぬー。

係)(いらっ)

な)え、えーと、

💡 ポイント
① Aの値をうけとる準備で、ACCEPTとか言ってたからACCEPT A
② Bの値を受け取る準備で、ACCEPT B
③ BからAを引く SUBSTRACT A FROM B
④ Bの結果表示 DISPLAY B

だからー、こんな感じですか?

📝 COBOL sample.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. SUB-TEST.

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

PROCEDURE DIVISION.
    ACCEPT A.
    ACCEPT B.
    SUBTRACT A FROM B.
    DISPLAY B.
    STOP RUN.

係)実行してみろ。

な)あい。

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

あれ?止まった??

係)入力待ちだろ。

な)へ?

係)Aに入れる値が入力されるのをまってる状態だ。
お前が何も入力しないから何も表示されてないだけだ。カーソルはあるだろ?

試しに1入れてエンター、2入れてエンターしてみろ。

な)あい…

あ!001になた!!

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

係)何か入れるよう促さないと、何も表示されないんだから何が起きてるかわからないだろ?

な)促す…?

「入力しやがれ」とかDISPLAYしとけってことす?

係)なんでやさぐれるんだよ…、でも、ま、そういうことだ。

ちょっと修正してみろ。

な)あい…

📝 COBOL sample.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. SUB-TEST.

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

PROCEDURE DIVISION.
    DISPLAY "Aの値を入れてエンター押せばいいじゃない"
    ACCEPT A.
    DISPLAY "Bをの値を入れてエンター押しちゃえばいいじゃないの"
    ACCEPT B.
    SUBTRACT A FROM B.
    DISPLAY B.
    STOP RUN.

こういうことっすかね。

係)なんで素直に書けないだよ、お前は…

で、実行してみろ。

な)みぎゃあああ!

係)な、なんだよ…

な)か、係長!壊した!壊しちゃった!!

係)なんかお前、嬉しそうじゃないか…? 良いから、一番下見てみろ

な)これすか…?

💻 ターミナル出力 実行結果
20 warnings generated.

係)まず、これはコンパイル失敗じゃない。実行ファイルは作られている可能性が高い。

なんのエラーかというと、これだな。

💡 ポイント
warning: illegal character encoding in string literal

「お前は英語も使えねーのか!」っていう警告だ。

な)ええええ!?ペリーでもそんなこと言わないっすよ!

係)例えばここだ。

📝 COBOL sample.cob
    DISPLAY "Aの値を入れてエンター押せばいいじゃない"

このアホな日本語が原因だって話だ。

な)え!?だったら、「Aの値を入力せよ!」とか?「あたいのために値を入力して!」とか?

係)そういうことじゃねーよ!!

GnuCOBOLは内部的にCコードに変換してからコンパイルしてるんでな、そのときCコンパイラに渡ると「illegal character encoding」警告になることがある。

画面に出た「\xE3\x82\xA2」はUTF-8の日本語だからな。

な)はぁ…やっぱ係長アンドロイドだから、機械語が読めるんすね…俺にはさっぱりです…

係)まだ言うのかよ!

いや、ま、今は知らなくてもいいんだけどな…

な)またひけらかしちゃいました!?

係)だから、なんでいきなり活き活きしだすんだよ!

解決方法は日本語を英語にするってことだな。

ただ!この警告は動作には問題ないことが多い。

な)え?

係)試しに実行してみろ!

な)あ、あい…

ぎゃああああ!か、係長!表示されてるぅぅぅ!!

💻 ターミナル出力 実行結果
./test
Aの値を入れてエンター押せばいいじゃない
1
Bをの値を入れてエンター押しちゃえばいいじゃないの
2
001

おむすび

係)うるさいな…でも、わかったろ、いちいち騒ぐなよ…

な)だってー、あんな何行にも渡って英語で罵倒されるとは思わなかったっす…七三分けでもアメリカ人は体格で有利ですね…

係)そもそも罵倒されてないだろが…

な)絶対、「ぐぬー」って言わせようと思ってんすよ!

係)だからお前が言いたいだけだろって!

係長のワンポイント

SUBTRACTは数式じゃない、動きの命令だ。
SUBTRACT A FROM BB = B - Aという処理になる。
だからFROMの向きを間違えると、計算の意味が逆になる。
そしてCOBOLにはセルがないから、値はACCEPTで入力する。
COBOLは「計算を書く言語」じゃない、「処理の流れを書く言語」だ。

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

この記事を書いた人

コメント

コメントする

CAPTCHA