🧩今日の学び
・IFは条件を書くものではなく「処理を分岐させる構造」であり、命令がなければ意味がない
・エラーの本質は文法ではなく設計(思考)にあり、ループも中身のロジックが重要
係長)ここまで来たら、あとできるな。
なるお)ええ、無理です。
係)は?
な)無理に決まってるじゃないすか!なに期待してんすか!期待は裏切ってこそのユダですよ!妖星舐めんなって話ですよ!
係)なに、ユダに浸ってんだよ!お前は化粧したところでって体型だろが!
な)ひど!
係)ひどくない!いいから書いていけっての。
な)むー
ロジックをそのままコードに落とせるか
まんずはいつものワンパターンからでしょー。
IDENTIFICATION DIVISION. PROGRAM-ID. CALC-SUM. DATA DIVISION. WORKING-STORAGE SECTION. 01 X PIC 9(3) VALUE 0. 01 TOTAL PIC9(5) VALUE 0. 01 Y PIC X(3). PROCEDURE DIVISION.
ってとこまでいいとして…、次ルーピングで、条件式っと。
IF構造で処理の分岐を組み立てる
① Y = "=" ? ② Y IS NUMERIC ? ③ NUMVALで変換 ④ TOTALに加算
こうだったから…
IF Y = "="
で立てておけば良いんじゃない〜
違ったら…ここでもう一回IF出現すかね。数字かどうかの判定もっすもんね。
Yに入力されたのが数字かどうか判定(ヌメりっく)
真だったら、計算へGO。ここで、Yの値を数字に変換(ぬむばる)して、Xに入れるって感じだったような。
偽だったら、エラー表示。
だから〜こうと。
ELSE
IF Y IS NUMERIC
NUMVAL Y TO X
ADD X TO TOTAL
ELSE
DISPLAY "ERROR ZANEN ENTER SUJI!!"
「もっすもんね」って可愛くないっす?「もっすもん」っていう響きが多幸感。
係)「もっすもん」なんてお前しか言わねーだろ。
それと、すまん、少し説明が足りてなかった。
FUNCTION NUMVALで数値変換を正しく書く
NUMVAL Y TO X NUMVALは関数 書き方:FUNCTION NUMVAL(Y)
な)???
係)NUMVALは関数としてCOBOLに組み込まれている。それを呼び出して使うんだ。
な)ほー
係)関数の呼び出し方は
FUNCTION 関数名(引数)
という感じだ。
な)ほー
係)以上だぞ。
な)ほー、お!?なにが以上なんすか!?
係)Excelで言うと、関数は(=)関数名で使うだろ?そして関数はネストもできる。そう考えると書き方変わらんだろ?
「=」の代わりがFUNCTIONだと思ってみて書いてみろ。
な)代わりってなんすか…。俺の代わりなんてそんなすぐ見つからないってもんすよ…
係)そうだな。
な)でしょー!
係)殴りたくなる部下はお前が始めだしな。
な)え!?
係)いいからやってみろっての!
な)むー…NUMVALが関数だから、FUNCTION使って呼び出すって話っすよね。引数っていまいちわかってないけど、Yを数字にして、Xに入れるだから、こう?
ELSE
IF Y IS NUMERIC
MOVE FUNCTION NUMVAL(Y) TO X
ADD X TO TOTAL
ELSE
DISPLAY "ERROR ZANEN ENTER SUJI!!"
係)前段のIFと合わせてみろ。
あときちんとIFを終わらせろ。
な)あ、あい…
IF Y = "="
ELSE
IF Y IS NUMERIC
MOVE FUNCTION NUMVAL(Y) TO X
ADD X TO TOTAL
ELSE
DISPLAY "ERROR ZANEN ENTER SUJI!!"
END-IF
係)ここから、ループを考えなければならんだろ?何回も入力して、それを回していくんだからな。
な)あ、そうでした…
係)何をどこまで回すんだ?
な)何って…入力された値で、=が入力されるまで?
係)そうだな。だったらそれでループさせてみろ。
な)…手がかりください…
PERFORM UNTILでループを完成させる
係)ループ覚えてるか?
今回だと
PERFORM UNTIL 式
何をループさせるか
でいいだろうな。あとは自分でやれ。
な)え!?いや、その…
うー、最近いきなり優しくないんだから…
UNTILだら式が適合するまでってことだよね。
さっき計算の流れはつくったわけだから、それを回すってことよね。
「いつまで」はYに=が入るまでってことでどうだろう。
あ、PERFORMだから終わるときは、END-PERFORMで終わらせる必要があるかな?
PERFORM UNTIL Y = "="
IF Y = "="
ELSE
IF Y IS NUMERIC
MOVE FUNCTION NUMVAL(Y) TO X
ADD X TO TOTAL
ELSE
DISPLAY "ERROR ZANEN ENTER SUJI!!"
END-IF
END-PERFORM
でいいのかなぁ…。
んで、入力するACCEPTをどっかに入れないとだよねぇ。判定する前だよね。
あと、入力促さないとわけわかんないんだわね。記憶力抜群すぎる自分が怖い。
PERFORM UNTIL Y = "="
DISPLAY "IRERO"
ACCEPT Y
IF Y = "="
ELSE
IF Y IS NUMERIC
MOVE FUNCTION NUMVAL(Y) TO X
ADD X TO TOTAL
ELSE
DISPLAY "ERROR ZANEN ENTER SUJI!!"
END-IF
END-PERFORM
あと=入力後の実行結果も入れときたいので、最後に「結果表示(DISPLAY)」を入れて、終わりって感じでいいかしら。
PERFORM UNTIL Y = "="
DISPLAY "IRERO"
ACCEPT Y
IF Y = "="
ELSE
IF Y IS NUMERIC
MOVE FUNCTION NUMVAL(Y) TO X
ADD X TO TOTAL
ELSE
DISPLAY "ERROR ZANEN ENTER SUJI!!"
END-IF
END-IF
END-PERFORM
DISPLAY TOTAL.
STOP RUN.
んで全部合体させてと…
1IDENTIFICATION DIVISION. 2PROGRAM-ID. CALC-SUM. 3 4DATA DIVISION. 5WORKING-STORAGE SECTION. 6 701 X PIC 9(3) VALUE 0. 801 TOTAL PIC9(5) VALUE 0. 901 Y PIC X(3). 10 11PROCEDURE DIVISION. 12 13PERFORM UNTIL Y = "=" 14 15 DISPLAY "IRERO". 16 ACCEPT Y. 17 18 IF Y = "=" 19 ELSE 20 IF Y IS NUMERIC 21 MOVE FUNCTION NUMVAL(Y) TO X 22 ADD X TO TOTAL 23 ELSE 24 DISPLAY "ERROR ZANEN ENTER SUJI!!" 25 END-IF 26 END-IF 27END-PERFORM 28 29DISPLAY TOTAL. 30STOP RUN.
これで実行・・・・・・・
sum.cobol:1: note: free format detected
1 > IDENTIFICATION DIVISION.
2 | PROGRAM-ID. CALC-SUM.
3 |
sum.cobol:18: warning: IF without imperative statement used [-Wdialect]
16 | ACCEPT Y
17 |
18 > IF Y = "="
19 | ELSE
20 | IF Y IS NUMERIC
な)絶対成功しないよね!知ってんだから!どうせ俺なんて…なんて…なn…
動かない原因は「書き方」ではなく「考え方」
係)なに騒いでんだよ…どら、見せてみろ。
①
PIC9(5) スペースない
②
ACCEPT Y スペースは全角スペースになってんじゃねーのか?
③
DISPLAY "IRERO".
ACCEPT Y.
ピリオドいらん
④
IF Y = "="
ELSE
条件しか書いてないからだな
係)相変わらずのケアレスミスばかりだな。
な)え、いや、④はなんなんす?
係)だからIF Y = "="って条件しか書いてないだろ?
な)むん…
係)だから、その下に命令がなく、すぐにELSEになっているだろって。
な)あーあーそういうことすか!
係)そうだ。じゃぁ続いてやれ。
な)あい…。
つか、なんで間違いすぐわかるのさね…ほんとアンドロイドなんだから。
んで、命令文がないのはだめだってことだから、、命令を作らないといけないわけ?…はぁ、これおわんの…椀物食いたい…お吸い物飲みたい。永谷園の松茸のお吸い物飲みたい。樽で…。
(次につづく)
係長のワンポイント
エラーは「文法ミス」ではなく、思考の穴が原因だ。IFは「条件を書くもの」ではなく、処理を分岐させる構造だ。
命令がないIFは、何もしていないのと同じ。
ループも同じで、「回す」だけでは意味がなく、中身の設計が本体だ。
プログラムは書いた通りではなく、”考えた通り”にしか動かない。

コメント