【COBOL 書き1-8-5】SUM計算機のコード書くぞー!〜何が問題?それが問題

🧩今日の学び
IFは条件を書くものではなく「処理を分岐させる構造」であり、命令がなければ意味がない
・エラーの本質は文法ではなく設計(思考)にあり、ループも中身のロジックが重要

係長)ここまで来たら、あとできるな。

なるお)ええ、無理です。

係)は?

な)無理に決まってるじゃないすか!なに期待してんすか!期待は裏切ってこそのユダですよ!妖星舐めんなって話ですよ!

係)なに、ユダに浸ってんだよ!お前は化粧したところでって体型だろが!

な)ひど!

係)ひどくない!いいから書いていけっての。

な)むー

ロジックをそのままコードに落とせるか

まんずはいつものワンパターンからでしょー。

📝 COBOL なるお案
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に加算

こうだったから…

📝 COBOL なるお案
IF Y = "="

で立てておけば良いんじゃない〜

違ったら…ここでもう一回IF出現すかね。数字かどうかの判定もっすもんね。

Yに入力されたのが数字かどうか判定(ヌメりっく)

 真だったら、計算へGO。ここで、Yの値を数字に変換(ぬむばる)して、Xに入れるって感じだったような。

 偽だったら、エラー表示。

だから〜こうと。

📝 COBOL なるお案
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に入れるだから、こう?

📝 COBOL なるお案
ELSE
    IF Y IS NUMERIC
      MOVE FUNCTION NUMVAL(Y) TO X
        ADD X TO TOTAL
    ELSE 
        DISPLAY "ERROR ZANEN ENTER SUJI!!" 

係)前段のIFと合わせてみろ。

あときちんとIFを終わらせろ。

な)あ、あい…

📝 COBOL なるお案
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で終わらせる必要があるかな?

📝 COBOL なるお案
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をどっかに入れないとだよねぇ。判定する前だよね。

あと、入力促さないとわけわかんないんだわね。記憶力抜群すぎる自分が怖い。

📝 COBOL なるお案
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)」を入れて、終わりって感じでいいかしら。

📝 COBOL なるお案
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.

んで全部合体させてと…

📝 COBOL sample.cob
  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は、何もしていないのと同じ。
ループも同じで、「回す」だけでは意味がなく、中身の設計が本体だ。
プログラムは書いた通りではなく、”考えた通り”にしか動かない。

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

この記事を書いた人

コメント

コメントする

CAPTCHA