🧩今日の学び
・COBOLの引き算はSUBTRACT A FROM BでB = B − Aの意味になる
・COBOLにはExcelのようなセルはなく、ACCEPTで入力値を受け取る必要がある
・GnuCOBOLでは日本語文字列により文字コード警告が出ることがあるが、実行自体は可能な場合が多い
な)足し算ってあんな感じなんすね…もういいっすよね、腹八分目が人間最強ですもんね、おつかれっすー。
係)なんで帰ろうとしてるんだよ!まだ勤務時間だろ!お前のハラなら三分目だろ!
な)俺少食なんで…
係)嘘つくな!カツカレー大盛りとラーメン食ってたんだろ。
な)なんで知ってるんす!?やばい超能力あります!?
係)うるさいな、お前の食う量おかしいだろって話があったんだよ!
な)え…、俺…、そんなにみんなの注目の的…?すごい…?
係)すごくねーからな!いいから座れ!次は引き算だぞ。
な)いやん…
COBOLの四則演算はこの4つ
係)いいか、COBOLはな、四則演算全部あるんだぞ。
な)え、そうなんすか。
係)基本はこれだ
ADD SUBTRACT MULTIPLY DIVIDE
な)でも、おれ、登り詰める男だから、引くとか割るとか無いっすから!常に上昇!増え続けますよ!
係)お前の体重の話はどうでもいいんだよ。
な)あ、でも常に燃え続ける男でもあるから、燃えて減っていくんすかね?人生って難しいっすね…。
係)知るかよ!
さっきの足し算はこうだったな。
ADD A TO B
そして、意味はこうだ。
B = B + A
な)もうバッチリングです。
係)… 引き算はこうだ。
SUBTRACT A FROM B
な)えーとBからAを引くとBはどうなるってことっすよね。
係)だったらどうなる?
な)んーと、こうです?
B = B - A
係)いいな。
な)おー!完璧すぎますよね!
引き算は「FROMの向き事故」に注意
係)… やりがちなミスとしてはこうだな。
SUBTRACT B FROM A
もちろん意味はこうだ
A = A - B
な)ぎゃくてにんぐ!
係)… COBOLではFROMの向き事故がよく起きるから気をつけろよ。
な)あいさー!
係)そして、お前が書いたコードに変数を入れ込むとしたらこうなるな。
01 A PIC 9(3). 01 B PIC 9(3). SUBTRACT A FROM B.
な)あー、俺の活躍の印が!!
係)その活躍したヒーローさんに聞くが、その値はどこから来るんだ?
COBOLにはセルがない、値は入力する
な)へ?どこって…そら…スポーンしてくるんじゃないすか…ゾンビみたいに。
係)Excelなら簡単だな?セルに書けばいいんだからな。
A1 = 5 A2 = 3
な)あ、スルーっすね…、聞いたの係長ですからね…
係)だがCOBOLにはセルはない。
な)そらないっすよね?
はっ!実はあるとか!?
係)入力するんだよ。
な)やっぱりある!?
ACCEPTで入力して計算する
係)ターミナルから入力できるようにするんだよ。
な)へ?A =5とか書くと勝手に入れてくれるとか?
係)そうじゃなく、コードの中にこう書いておくんだ。
ACCEPT A. ACCEPT B.
ターミナルからの入力した値をCOBOLで値を受け取るように書いておく必要があるというわけだ。
な)ほー
係)そして結果を見るにはこうだったな。
DISPLAY B.
な)これは知ってる!
係)流れを言うからかいてみろ。
Aの値をうけとる準備 Bの値を受け取る準備 BからAを引く Bの結果表示
このコードを書け。
な)え…、そんなマサチューセッツ工科大学的な問題出されても…。あ、マサチューセッツって言えます?
やっぱ「マサチューセッチュッ♡」って言っちゃいますよねー。
係)言わないから早くやれ。
な)ぐぬー。
係)(いらっ)
な)え、えーと、
① Aの値をうけとる準備で、ACCEPTとか言ってたからACCEPT A ② Bの値を受け取る準備で、ACCEPT B ③ BからAを引く SUBSTRACT A FROM B ④ Bの結果表示 DISPLAY B
だからー、こんな感じですか?
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しとけってことす?
係)なんでやさぐれるんだよ…、でも、ま、そういうことだ。
ちょっと修正してみろ。
な)あい…
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
「お前は英語も使えねーのか!」っていう警告だ。
な)ええええ!?ペリーでもそんなこと言わないっすよ!
係)例えばここだ。
DISPLAY "Aの値を入れてエンター押せばいいじゃない"
このアホな日本語が原因だって話だ。
な)え!?だったら、「Aの値を入力せよ!」とか?「あたいのために値を入力して!」とか?
係)そういうことじゃねーよ!!
GnuCOBOLは内部的にCコードに変換してからコンパイルしてるんでな、そのときCコンパイラに渡ると「illegal character encoding」警告になることがある。
画面に出た「\xE3\x82\xA2」はUTF-8の日本語だからな。
な)はぁ…やっぱ係長アンドロイドだから、機械語が読めるんすね…俺にはさっぱりです…
係)まだ言うのかよ!
いや、ま、今は知らなくてもいいんだけどな…
な)またひけらかしちゃいました!?
係)だから、なんでいきなり活き活きしだすんだよ!
解決方法は日本語を英語にするってことだな。
ただ!この警告は動作には問題ないことが多い。
な)え?
係)試しに実行してみろ!
な)あ、あい…
ぎゃああああ!か、係長!表示されてるぅぅぅ!!
./test Aの値を入れてエンター押せばいいじゃない 1 Bをの値を入れてエンター押しちゃえばいいじゃないの 2 001
おむすび
係)うるさいな…でも、わかったろ、いちいち騒ぐなよ…
な)だってー、あんな何行にも渡って英語で罵倒されるとは思わなかったっす…七三分けでもアメリカ人は体格で有利ですね…
係)そもそも罵倒されてないだろが…
な)絶対、「ぐぬー」って言わせようと思ってんすよ!
係)だからお前が言いたいだけだろって!
係長のワンポイント
SUBTRACTは数式じゃない、動きの命令だ。SUBTRACT A FROM BはB = B - Aという処理になる。
だからFROMの向きを間違えると、計算の意味が逆になる。
そしてCOBOLにはセルがないから、値はACCEPTで入力する。
COBOLは「計算を書く言語」じゃない、「処理の流れを書く言語」だ。

コメント