【COBOL 書き1-12-4】中央値の考え方とコードへの落とし方〜残念な結果

🧩今日の学び
・中央値を求めるには、SORT済みデータの件数から中央位置を計算し、奇数件と偶数件で取得方法を分ける。
・奇数件では件数÷2の整数部分+1番目、偶数件では件数÷2番目とその次の値を使う。
・複雑な条件をそのままコードにせず、中央位置を基準とした単純な処理へ組み直すことが重要である。

係長)それで?

なるお)それで??

係)何するんだって言ってんだよ!

な)あー、何もしないに3票

係)しろよ!って3票って何だよ!

な)いやー存在価値だけでも複数票もらえるんじゃないかと思って

係)だったら、マイナスだろ…

な)なんで!?

係)いいから、今回はPROCEDURE DIVISIONを考えてみろよ。

な)えー、誠に遺憾ながら…

係)(イラッ)

まずはPROCEDURE DIVISIONを組み立てよう

な)え、えーと…こんなふうにFDとSDを考えたと

📝 COBOL 最終DATA部
FD INPUT-FILE.
01 INPUT-RECORD.
    05 INPUT-SALE-DATE    PIC X(10).
    05 INPUT-ITEM-NAME    PIC X(20).
    05 INPUT-AMOUNT       PIC 9(5).

SD SORT-FILE.
01 SORT-RECORD.
   05 SORT-SALE-DATE PIC X(10).
   05 SORT-ITEM-NAME PIC X(20).
   05 SORT-AMOUNT    PIC 9(5).

FD OUTPUT-FILE.
01 OUTPUT-RECORD.
    05 OUTPUT-SALE-DATE    PIC X(10).
    05 OUTPUT-ITEM-NAME    PIC X(20).
    05 OUTPUT-AMOUNT       PIC 9(5).

あれ?こんぐらいしかできてないの?何やってたの、あたし?

係)そうだよ。

だから、PROCEDURE DIVISIONを作れって話をしてんだよ。

な)ぐむむ…

作れ言われて簡単に作れたら、そらハッピーでしょうよー、ハッピーターンの魔法の粉のスープでしょうよ

係)いいから、まず中央値の考え方を落とし込めよ。

な)ふむぅ…数字の数が偶数個と奇数個で違うんですよね

奇数と偶数では中央値の求め方が違う

な)数字の数が奇数個だったら、カウント+12で割った数が中央値でいいわけで…

そもそも偶数個のときって中央値はどうなるんす?

係)偶数個も同様にカウント+1まではいいが、今度は2で割っても整数にはならないだろ?

だから2で割った数字の前後の数字を足して平均を出すんだよ。

な)え?なにその嘘っぽいやつ!

係)10〜15までの6つの数字の中央値を出すとして、6つの数字を+1するから7、それを2で割ると3.5。その前後のすうじだから、3番目(12)と4番目(13)の数字の平均が中央値(25/2=12.5)ということだ。

これでもう分かるだろ。

な)えー…、割った数字の前後の数字ってなにさ…、そんなの、母さんが夜なべしてスーパーコンピーターを数台つなぎ合わせてくれても…無理じゃない?

係)そんな技術力あるならできるだろ!

まったく…、だからこれはな…

中央値のロジックを整理してみる

な)あ、でも3.5の前後の整数って考えれば良いのかしら?

係)む…

な)つまりは、3.5がでれば、3.5<Xとしたら、最初のXになるし、3.5>Xとしたら、最後のX3になるわけだし、こういうことっすね!

つまり、個数をカウントからのー、if使って場合分けで…

①奇数だったら、2で割った数字の場所が中央値!

②偶数だったら、2で割った数字は必ずx.5になるからして、それ以下の最大値の整数と、それ以上の最小値の整数の場所の数字を探し出して、足して2で割った数字が中央値!

どうこれ!?天才すぎじゃね、これ!?きゃー!

係)うるさいっての!

だが、まぁ考え方は正しいな。

な)でそ!もうミシガン大卒、名乗れます!?

係)名乗れるかよ!なんでミシガン大学なんだよ⋯

な)ミシガンってゲームがあって!

係)あ、もういいから。

な)え!?

コードはもっと単純に考えられる

係)だがな、中央の場所が3.5とだして、最小値とか最大値とかコードとして書くか?ってことだ。

それだけで、ごちゃごちゃするだろ?

な)うー現実主義…

係)こういうところが腕の見せ所なんだぞ。

な)係長の腕って毛深いっすよね

係)うるさいわ!そういうこと言ってんじゃねーよ!

もっと単純化できないか考えてみろって言ってんだよ!

な)あーそゆことー、係長がもっと単純化して言ってくれればいいのにー

係)ぐっ…

な)単純化いってもなー、34を取り出すんでしょー、むむむぅ

あれ?個数の最大値(偶数)を2で割った数字と、それに+1した数字ってことじゃないの?

係)…お前わかっててやってんじゃないだろうな…

な)何いってんす?

だから、1 ~ 6までだから、6で偶数ってことで、62で割って3だから3番目とそれに+1した4番目!

これでどうです!?違います!?

係)いいだろう。

な)おー!やはり!

係)そういう流れでPROCEDURE DIVISIONを考えてみろ。

な)あいあいさー!

おむすび

な)…でも、そんな単純なもんじゃないっすよね…

係)そらそうだろ。

でも、ここまでいろいろやってきたんだから、考えることはできるだろ?

な)その考えるっていう作業を俺等は東京湾に捨てちまって、後片付けはAIにやらせちまいましょうぜ、オジキ!

係)誰がオジキだよ!?

な)えー、この方が呼ばれ慣れてるんじゃないんですか?

係)誰にだよ!

な)残念です…(シュン)

係)コードが通らないことを残念がれよ!

(次話へ続く)

係長のワンポイント

中央値は「複雑な条件を並べる処理」じゃない。
本当は、並べたデータの中央位置をどう求めるかという設計だ。
よくある誤解は、偶数なら3.5の前後を探す処理をそのまま書くことだが、それではコードが複雑になる。
だから件数を2で割り、必要な位置だけを整数として取り出せる形へ単純化する。
その結果、奇数と偶数の違いも、中央位置を基準に整理できる。
COBOLは思いついた手順を全部書く言語ではなく、処理を単純な形へ組み直す言語だ。

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

この記事を書いた人

コメント

コメントする

CAPTCHA