【COBOL 書き1-11-1】データを読み込んで平均値(Average)を出してみる〜清涼感あふれるコード

🧩今日の学び
・平均値は、読み込んだ金額の合計とデータ件数を集計し、最後に割ることで求められる。
ADDで合計を増やすだけでなく、COUNT-LOOPINGで件数も同時に数える必要がある。
・割り切れない平均値を扱うには、PIC 9(7)V9のように仮想小数点Vを使った数値設計が必要になる。

係長)よし、次はお前のデブデータの金額の平均出してみろ。

なるお)係長って人に対する敬意ってものがないっすよね

係)お前の何を敬うんだよ…

な)RPGをやるとラスボスの前ぐらいで飽きてやめちゃうとことか?

係)どこに敬うポイントがあるんだよ!

な)先を見通す力っすよ!

係)……はいはい、あるある。

な)そういうとこ!

係)どうでもいいから、やれ!

目次

平均値は「合計÷件数」で求められる

な)きゅむ〜

……でも、実は簡単じゃね?

ルーピングで金額の合計を出して、ルーピングの回数で割るだけの簡単なお料理系、常備菜みたいなもんよ、これ。常備菜っていうけど、一日で食べちゃうから、常備できないから名前負けしてるけど。

とはいえ、人を舐めすぎだから、この人!

コーラで喉をシュワりながら、ゆっくりやることも可能だってことを思い知れ!

でも、ま、とりあえず、やっちゃわないとね。

絶対文句言ってくるから、この人!何やってんだとかすぐ切れるから、この人!5分でできただろ?とか言ってくるから、この人!

ま、このうっとり済みコードを改造させちゃうのが早いかなー

📝 COBOL sum.cob
  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.

んで、データはこれっと。

📝 COBOL データ
2025-12-31hoshiimo            02500
2026-01-01gyudon2             00900
2026-01-01curry               01500
2026-01-02gyudon2             00900
2026-01-03hoshiimo            02500

ループ回数を数えて件数を集計する

まんず、ループ回数をカウントするやつを作ってーと、

📝 COBOL 検討中
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.  ←追加

んで、合計はこのコードでするから、あとはルーピングをカウントすればいいわけだからして、こうっちゅ!

📝 COBOL 検討中
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を計算する

そして、合計とカウント数を割るって平均はこうっちゅ!

📝 COBOL 検討中
DIVIDE COUNT-LOOPING INTO TOTAL-AMOUNT.  ←追加

DISPLAY "AVERAGE AMOUNT: " TOTAL-AMOUNT.  ←変更

んで、全体直し給うて…こうっちゅ!

📝 COBOL average.cob
  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円の卵がついてくるとかの牛道にランクアップで、量は無情な少なさ、どこか作るんだってぐらい小さい丼で、提供と

📝 COBOL データ(高級)
  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とかつけてたから

📝 COBOL 再検討
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は計算する言語ではなく、集めたデータから意味を作る言語だ。

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

この記事を書いた人

コメント

コメントする

CAPTCHA


目次