🧩今日の学び
・ACCEPTで入力した値を変数に入れることで、実行時に集計条件を変えられる。
・IF文の条件を固定文字列から変数比較に変えることで、SUMIFのような条件一致合計ができる。
・ACCEPTはREADループの外で一度だけ受けることで、毎回入力を求める事故を防げる。
なるお)係長!たのもー!
係長)な、なんだよ…
な)たのもーっすよ!
係)朝からうるさいな…
な)はいこれ!どうこれ!
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
はい!はい!はいはいはい!
係)だからうるさいって。
SEKAI NO OWARIっていつまで表示してるんだよ。
な)んが!
係)せめてなんの合計なのかぐらいは表示しろよ。
な)んがが!
せめて褒めてから、けなして!
係)ま、OKだな。
な)ほんとすか!ついに係長が褒めた!?
係)だったら、次は、これを「入力対応」にしてみろ。
な)んが!?
ACCEPTした値でSUMIFしたい
係)入力した条件の合計をするようにしてみろ。
な)まだ、おれたちの戦いは終わらない!?
係)そこまで1人でできたんだ、今回もできるだろ。
な)ぎゃふん…
…えーと?入力はACCEPTよね。
まずはACCEPTで受けた文字を条件に合計できるようにしてみよか
入力した文字を受け入れる変数を宣言!
WORKING-STORAGE SECTION. 01 EOF-FLAG PIC X VALUE "N". 01 INPUT-NAME PIC X(20). ←追加 01 TOTAL-AMOUNT PIC 9(7) VALUE 0.
ACCEPTはループの外で受ける
ACCEPTはルーピングの外じゃないと毎回入力とかになっちゃうから、PERFORMの外でACCEPTしましょう。そうしましょう。
DISPLAY "ENTER".
ACCEPT INPUT-NAME.
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.
そうそう、まだ、条件が= "hoshiimo“のままなので、ここ直さなくちゃね。
ITEM-NAMEとINPUT-NAMEを比較する
INPUT-NAMEに入力した条件が入って、それをITEM-NAMEと対比させて正誤が決まるようになるんだから、こう!
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 = INPUT-NAME ← 修正
ADD AMOUNT TO TOTAL-AMOUNT
END-IF
END-READ
END-PERFORM.
で、実行!
2025-12-31hoshiimo 02500 2026-01-01gyudon2 00900 2026-01-01curry 01500 2026-01-02gyudon2 00900 2026-01-03hoshiimo 02500
今回の条件はgyudon2でいく!
係)2ってなんだ?
な)牛丼2杯ですよ!常識ですよ常識!ほんと常識知らずなんだから!もう!そんなんでおじいさんになっちゃいけません!
係)あ、そ…。
って誰がおじいさんだよ!
な)んで、うっとり!
gyudon2 SEKAI NO OWARI TOTAL: 0001800
な)むはーん!!出ちった、でちったよー、係長!
係)だからうるさいんだよ⋯。そしてSEKAI NO OWARI!
な)もう「SEKAI NO OWARI」が無い世界なんて世界の終わりよ!
係)何言ってんだ…
おむすび
係)ま、まぁ、昨日からちゃんとやってたんだな。
な)そっすよ!先に帰るとはどういう了見すか!ちゃんと最後まで見ててくださいよ!目を離さないでくださいよ!Look at Me & My Soul!
係)ほんと、うちの犬と同じだな。
な)は?
係)トイレも見ててやらないとできないからな。
な)トイレは見ててほしくないから!
係長のワンポイント
SUMIFは「hoshiimo専用処理」ではない。
入力された条件を使って、実行時に比較内容を変えられる仕組みだ。
よくある誤解は「IFの文字を書き換える」ことだが、実際は比較対象を変数化している。
だから ACCEPT をループの外で一度受け、INPUT-NAME を比較条件として使う。
その結果、コードを書き換えなくても、「gyudon2」でも「curry」でも集計できる。
COBOLは固定処理を書く言語ではなく、“入力によって動作を変える流れ”を設計する言語だ。

【今回の完成コード】
IDENTIFICATION DIVISION.
PROGRAM-ID. NARUO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT NARUO-FILE
ASSIGN TO "naruo2.txt" ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD NARUO-FILE.
01 NARUO-RECORD.
05 SALE-DATE PIC X(10).
05 ITEM-NAME PIC X(20).
05 AMOUNT PIC 9(5).
WORKING-STORAGE SECTION.
01 EOF-FLAG PIC X VALUE "N".
01 INPUT-NAME PIC X(20).
01 TOTAL-AMOUNT PIC 9(7) VALUE 0.
PROCEDURE DIVISION.
OPEN INPUT NARUO-FILE.
DISPLAY "ENTER".
ACCEPT INPUT-NAME.
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 = INPUT-NAME
ADD AMOUNT TO TOTAL-AMOUNT
END-IF
END-READ
END-PERFORM.
DISPLAY "TOTAL: " TOTAL-AMOUNT.
CLOSE NARUO-FILE.
STOP RUN.
係)だから「SEKAI NO OWARI」!!

コメント