🧩今日の学び
・COBOLでは、読み込んだ金額をTOTAL-AMOUNTへADDすることで単純合計を作れる。
・SUMIF的な条件付き合計は、特別な命令ではなく「READループの中でIF判定して足す」処理構造で実現する。
・COBOLは関数を呼ぶだけの言語ではなく、条件と流れを組み立てて処理を作る言語だ。
なるお)んじゃ、改行コードは気をつけるという標語をトイレに貼っときますから、みんなで確認しましょう!
今日の敵は明日も敵!はい!
係長)いらんことしてないで、合計しろ。
なるお)ほ?
係)だから、金額を合計してみろって。
な)なんの?
係)今何やってるのか忘れてんのか!
な)えー、マイナスドライバーでプラスのネジ穴を回したら、ずるってなめちゃったから、とりあえず、なかったことにしておく感じとか?
係)何の話だよ…
な) なんでプラスドライバー置いてないのって話ですよ!
係)どうでもいいわ!
いいから、お前が贅肉を溜め込むために使ってる金額を合計しろって言ってんだよ!
な)また、溜めハラですか…
係)SUMの流れをいまやってるんだろが。
今は1件ずつ表示しただけだ。でも本当にやることはなんだった?データを読み込んで、合計することだろ。
な)あー、途方もなく昔の話なんで…long long time agoじゃ片付けられないぐらい遠い昔の話なんで。金星ぐらい遠いんで。でも金星は一番地球から近いという矛盾に悩まされ続ける。
困ったもんですね…
係)困ってるのはお前だけだろ…
読み込んだ金額を合計していく
係)そんなことはいいから、これを合計して
2500 900 1500 900 2500
こうしたいってわけだ。
8300
これをどうやるんだって話だ。
データを読み込むってだけで、合計はすでに一回やった話だ。
だからやってみろ。
な)あい…
READループの中でADD、TOTAL-AMOUNTに加算し続ける
うー、データを読み込んで、そのなかの金額を足していく変数を別途作って、それを足していくって感じかな?
今回は金額がAMOUNTだから、TOTAL-AMOUNTという変数をつくることにしといて…
TOTAL-AMOUNTにゼロを入れて、ルーピングにイン
データを読み込むとAMOUNTに1行目の金額が入る
AMOUNTとTOTAL-AMOUNTを足し合わせる
んで、次のルーピングへイン
データが最後まで行ったら、EOF-FLAGにYを入れて合計を表示して終わり…
みたいなんで、どうざましょ?
係)それで作ってみろ。
な)あーい
1IDENTIFICATION DIVISION. 2PROGRAM-ID. NARUO. 3 4ENVIRONMENT DIVISION. 5INPUT-OUTPUT SECTION. 6FILE-CONTROL. 7 SELECT NARUO-FILE 8 ASSIGN TO "naruo2.txt" ORGANIZATION IS LINE SEQUENTIAL. 9 10DATA DIVISION. 11FILE SECTION. 12 13FD NARUO-FILE. 1401 NARUO-RECORD. 15 05 SALE-DATE PIC X(10). 16 05 ITEM-NAME PIC X(20). 17 05 AMOUNT PIC 9(5). 18 19WORKING-STORAGE SECTION. 2001 EOF-FLAG PIC X VALUE "N". 21 2201 TOTAL-AMOUNT PIC 9(7) VALUE 0. 23 24PROCEDURE DIVISION. 25OPEN INPUT NARUO-FILE. 26 27PERFORM UNTIL EOF-FLAG = "Y" 28 READ NARUO-FILE 29 AT END 30 MOVE "Y" TO EOF-FLAG 31 DISPLAY "SEKAI NO OWARI" 32 NOT AT END 33 ADD AMOUNT TO TOTAL-AMOUNT 34 END-READ 35END-PERFORM. 36 37DISPLAY "TOTAL: " TOTAL-AMOUNT. 38 39CLOSE NARUO-FILE. 40STOP RUN.
こんなんでどうでげす?
係)実行してみろ。
な)あいー
SEKAI NO OWARI TOTAL: 0008300
おほ!一発ツモ!裏ドラ8で、クソみたいなリーのみが三倍満すよ!完璧!ミラクルワンダーボーイ!
係)ミラクルだと困るんだよ!そもそもどこにドラ8の要素あるんだよ…
な)なんかミラクルがリアルに置き換わってきたって感じですね!
係)……
な)どしたんす?怖い顔して?あ、いつもか! ケラケラ
係)……間違えろよ!!
な)は!?
係)なにちゃんとしたコード一発で出してきてんだ!正解を一発で書くなんてお前らしくないだろが!お前を困らせるのが俺の日課だってのに!
な)また、なに言ってんのこの人!?
係)わかった。よーくわかった。
だったら、条件合致合計のSUMIF作ってみろ!
な)へ!?
係)いいか、俺は帰るから、やっとけよ!明日報告しろ!
な)…ほんとに帰りやがった…
くそー!あのおっさん、なに変な逆ギレしてんの!?ほんと老害 over 老害なんだから!ガンカー・プンスムを超える人類未踏のTop老害ヤーなんだから!
条件付き合計はIFで分岐する
ま、いいや…
…んで…SUMIFって、条件指定して、その条件に合う値を足していくってやつだから…
例えば、干し芋だけ取り出して、合計ってかんじよね
2025-12-31hoshiimo 02500 2026-01-01gyudon2 00900 2026-01-01curry 01500 2026-01-02gyudon2 00900 2026-01-03hoshiimo 02500
データがこうで
FD NARUO-FILE.
01 NARUO-RECORD.
05 SALE-DATE PIC X(10).
05 ITEM-NAME PIC X(20).
05 AMOUNT PIC 9(5).
変数がこうだから、
IF ITEM-NAME = "hoshiimo"
ADD AMOUNT TO TOTAL-AMOUNT
END-IF
ITEM-NAMEを条件判断で、条件を満たせば合計にプラスするみたいなことを考えてー、これをルーピングに組み込んじゃうみたいな?
PERFORM UNTIL EOF-FLAG = "Y"
READ NARUO-FILE
AT END
MOVE "Y" TO EOF-FLAG
DISPLAY "SEKAI NO OWARI"
NOT AT END
ADD AMOUNT TO TOTAL-AMOUNT
END-READ
END-PERFORM.
DISPLAY "TOTAL: " TOTAL-AMOUNT.
IFをループの中へ組み込む
組み込むのはっと…NOT AT ENDの中よね。今のADD AMOUNT TO TOTAL-AMOUNTと置き換えると。
PERFORM UNTIL EOF-FLAG = "Y"
READ NARUO-FILE
AT END
MOVE "Y" TO EOF-FLAG
DISPLAY "SEKAI NO OWARI"
NOT AT END
IF ITEM-NAME = "hoshiimo"
ADD AMOUNT TO TOTAL-AMOUNT
END-IF
END-READ
END-PERFORM.
DISPLAY "TOTAL: " TOTAL-AMOUNT.
んで全体整理して…
1IDENTIFICATION DIVISION. 2PROGRAM-ID. NARUO. 3 4ENVIRONMENT DIVISION. 5INPUT-OUTPUT SECTION. 6FILE-CONTROL. 7 SELECT NARUO-FILE 8 ASSIGN TO "naruo2.txt" ORGANIZATION IS LINE SEQUENTIAL. 9 10DATA DIVISION. 11FILE SECTION. 12 13FD NARUO-FILE. 1401 NARUO-RECORD. 15 05 SALE-DATE PIC X(10). 16 05 ITEM-NAME PIC X(20). 17 05 AMOUNT PIC 9(5). 18 19WORKING-STORAGE SECTION. 2001 EOF-FLAG PIC X VALUE "N". 21 2201 TOTAL-AMOUNT PIC 9(7) VALUE 0. 23 24PROCEDURE DIVISION. 25OPEN INPUT NARUO-FILE. 26 27PERFORM UNTIL EOF-FLAG = "Y" 28 READ NARUO-FILE 29 AT END 30 MOVE "Y" TO EOF-FLAG 31 DISPLAY "SEKAI NO OWARI" 32 NOT AT END 33 IF ITEM-NAME = "hoshiimo" 34 ADD AMOUNT TO TOTAL-AMOUNT 35 END-IF 36 END-READ 37END-PERFORM. 38 39DISPLAY "TOTAL: " TOTAL-AMOUNT. 40 41CLOSE NARUO-FILE. 42STOP RUN.
これでどうだっちゅうねん!
SEKAI NO OWARI TOTAL: 0005000
うほー!てやんでぃ!
ぐふふ、また係長の悔しそうな顔が目に浮かぶ、悔やんで悔しがれってんだ!
おむすび
くそーこうなったら、明日呑気な顔して出社してきたら、ギッコンバッタンにして、あーして、こーして…
……
殺されちゃうかな…短い命なのかな…セミなのかな
でも地上に出てきたセミの命って1か月とかにもなるっちゅーから長いとか言われるようになったわね。
でも1か月だからね!もうそれ余命だからね!
…ま…帰ろ…
(次回に続く)
係長のワンポイント
SUMIFは特別な命令じゃない。
「読む → 条件判定 → 足す」を組み合わせた処理構造だ。
よくある誤解は「SUMIFという魔法がある」だが、実際はIFで分岐しているだけだ。
だから条件を変えれば、「干し芋だけ」「900円以上だけ」など自由に集計できる。
その結果、ループの中で“データを選別しながら処理する”という考え方が生まれる。
COBOLは関数を呼ぶ言語ではなく、条件と流れを組み立てて処理を作る言語だ。


コメント