🧩今日の学び
・平均値は、読み込んだ金額の合計とデータ件数を集計し、最後に割ることで求められる。
・ADDで合計を増やすだけでなく、COUNT-LOOPINGで件数も同時に数える必要がある。
・割り切れない平均値を扱うには、PIC 9(7)V9のように仮想小数点Vを使った数値設計が必要になる。
係長)よし、次はお前のデブデータの金額の平均出してみろ。
なるお)係長って人に対する敬意ってものがないっすよね
係)お前の何を敬うんだよ…
な)RPGをやるとラスボスの前ぐらいで飽きてやめちゃうとことか?
係)どこに敬うポイントがあるんだよ!
な)先を見通す力っすよ!
係)……はいはい、あるある。
な)そういうとこ!
係)どうでもいいから、やれ!
平均値は「合計÷件数」で求められる
な)きゅむ〜
……でも、実は簡単じゃね?
ルーピングで金額の合計を出して、ルーピングの回数で割るだけの簡単なお料理系、常備菜みたいなもんよ、これ。常備菜っていうけど、一日で食べちゃうから、常備できないから名前負けしてるけど。
とはいえ、人を舐めすぎだから、この人!
コーラで喉をシュワりながら、ゆっくりやることも可能だってことを思い知れ!
でも、ま、とりあえず、やっちゃわないとね。
絶対文句言ってくるから、この人!何やってんだとかすぐ切れるから、この人!5分でできただろ?とか言ってくるから、この人!
ま、このうっとり済みコードを改造させちゃうのが早いかなー
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.
んで、データはこれっと。
2025-12-31hoshiimo 02500 2026-01-01gyudon2 00900 2026-01-01curry 01500 2026-01-02gyudon2 00900 2026-01-03hoshiimo 02500
ループ回数を数えて件数を集計する
まんず、ループ回数をカウントするやつを作ってーと、
WORKING-STORAGE SECTION. 01 EOF-FLAG PIC X VALUE "N". 01 TOTAL-AMOUNT PIC 9(7) VALUE 0. 01 COUNT-LOOPING PIC 9(2) VALUE 0. ←追加
んで、合計はこのコードでするから、あとはルーピングをカウントすればいいわけだからして、こうっちゅ!
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
ADD 1 TO COUNT-LOOPING ←追加
END-READ
END-PERFORM.
DIVIDEでAverageを計算する
そして、合計とカウント数を割るって平均はこうっちゅ!
DIVIDE COUNT-LOOPING INTO TOTAL-AMOUNT. ←追加 DISPLAY "AVERAGE AMOUNT: " 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 24 2501 COUNT-LOOPING PIC 9(2) VALUE 0. 26 27PROCEDURE DIVISION. 28OPEN INPUT NARUO-FILE. 29 30PERFORM UNTIL EOF-FLAG = "Y" 31 READ NARUO-FILE 32 AT END 33 MOVE "Y" TO EOF-FLAG 34 DISPLAY "SEKAI NO OWARI" 35 NOT AT END 36 ADD AMOUNT TO TOTAL-AMOUNT 37 ADD 1 TO COUNT-LOOPING 38 END-READ 39END-PERFORM. 40 41DIVIDE COUNT-LOOPING INTO TOTAL-AMOUNT. 42DISPLAY "AVERAGE AMOUNT: " TOTAL-AMOUNT. 43 44CLOSE NARUO-FILE. 45STOP RUN.
んでうっとりGO!
・・・
・・
・
恐ろしい。こんなに恐ろしいことがあるのだろうか。世の中の全ての恐れを超越してBEST OF OSORE。
係)なんでBESTなんだよ…
な)あ、聞いてました?
だったら、はい!
係)あん?
な)はい!はい!はい!
係)うるさい…
な)見てって言ってんの!
係)だったらそう言えよ!
な)はよみて!
SEKAI NO OWARI AVERAGE AMOUNT: 0001660
係)……お前いつまでSEKAI NO OWARI入れ続けるんだよ!
な)毎回そこに注目しないで!
係)どうやっても目に入っるっての!いい加減消せ!
な)大事なのは、結果!清涼感あふれる結果!
係)どこに清涼感があるんだよ…うっとりじゃなかったのかよ…
な)いやぁ、夏!クーラー!巣ごもり!ってなもんで
係)いつまで巣ごもりするつもりだよ!
ったく…まぁ……悪くはない。
な)おお!
割り切れない平均値はどうする?
係)ただ、良くはない。
な)だからなんでけなすの!?
係)お前が褒めてからけなせって言ったんだろが!
な)早すぎるから!けなすのが早すぎるから!オーケストラは最後の余韻に浸ってからブラボーですよ!常識ですよ!定説ですよ!「マスターいつもの」ですよ!
係)そんなことよりだ!
たまたま割り切れたから良かったが、割り切れなかったら、どうするつもりだったんだよ。
な)え…と、この世の中は人間の思い通りにならないという前例の先駈けとして…?
係)適当にやるな。確実に後悔するぞ。
これも前に教えてるんだから、思い出しながら直してみろ。
な)ふぁい…
係)前にもやったVの話だ。
な)…? …え、以上!?
それヒントじゃないから!
VはバーチャルついちゃえばなんでもVですよ!バーチャル軒下で佇むバーチャルおばあちゃんのバーチャル命を狙うバーチャル赤ずきんちゃんや狼とか!
係)何でもバーチャルつけるんじゃねーよ!って、狼だけなんでリアルなんだよ!
いいからやってみろっての!
な)むぐぐぐ…
むー、割り切れないってことだから、つまりは、小数点ってことだよね
Vとか9とかやったような記憶はあるからして…
まず、データが割り切れるのが悪いんだから、牛丼の一つを超高級料亭牛丼にしておこか
サシにサシが入っている真っ白な黒毛和牛や1個1000円の卵がついてくるとかの牛道にランクアップで、量は無情な少なさ、どこか作るんだってぐらい小さい丼で、提供と
12025-12-31hoshiimo 02500 22026-01-01gyudon2 00900 32026-01-01curry 01500 42026-01-02gyudon2 11111 ←修正 52026-01-03hoshiimo 02500 6
これで合計18,511だから、5で割ると3,702.2になって、ご所望の小数結果の出来上がりっと
Vは小数を扱うための仮想小数点
そんでもって、TOTAL-AMOUNTが小数を扱えるようにする必要があると…Vとか.とかなんだっつーの
でもなんかVとか9とかつけてたから
WORKING-STORAGE SECTION. 01 EOF-FLAG PIC X VALUE "N". 01 TOTAL-AMOUNT PIC 9(7)V9 VALUE 0. ←修正 01 COUNT-LOOPING PIC 9(2) VALUE 0.
なんかこぼるんっぽく書くとこんな感じよね?
って、これでいけるんじゃないの?
SEKAI NO OWARI AVERAGE AMOUNT: 0003702.2
……あら?あっさりできちった、なにこの楽勝加減
係長ーできちゃいましたよー
係)なんか、うるさくないお前も気持ち悪いな…
な)どっちが正解!?いいから見て見て!
係)………駄目だ。
な)え?何が駄目?
またSEKAI NO OWARI?
係)わかってんなら消せっての!
良いか、お前の書き方はGnuCOBOLならOKってだけだ。
もう少し説明するぞ。
Vは計算用の仮想小数点だ。Vがなければ、小数部を持つ数値項目として扱えない。
しかし、Vがあれば、小数点を表示するかというとそうではないんだ。
GnuCOBOLはいろいろ自動でやってくれる。
しかし、GnuCOBOLが正解=すべてのCOBOL実行環境で正解とは限らないからな、いろいろ試行錯誤してみろ。
な)むぅ…
(続く)
係長のワンポイント
平均値は「特別な計算」ではない。
合計と件数という、すでに集めたデータから作られる結果だ。
よくある誤解は「DIVIDEすれば終わり」だが、実際は件数を正しく数えていることが前提になる。
だからループ回数も集計対象として管理しなければならない。
その結果、割り切れない値が現れ、小数点という新しい設計課題が見えてくる。
COBOLは計算する言語ではなく、集めたデータから意味を作る言語だ。


コメント