🧩今日の学び
・中央値を求めるには、SORT済みデータの件数から中央位置を計算し、奇数件と偶数件で取得方法を分ける。
・奇数件では件数÷2の整数部分+1番目、偶数件では件数÷2番目とその次の値を使う。
・複雑な条件をそのままコードにせず、中央位置を基準とした単純な処理へ組み直すことが重要である。
係長)それで?
なるお)それで??
係)何するんだって言ってんだよ!
な)あー、何もしないに3票
係)しろよ!って3票って何だよ!
な)いやー存在価値だけでも複数票もらえるんじゃないかと思って
係)だったら、マイナスだろ…
な)なんで!?
係)いいから、今回はPROCEDURE DIVISIONを考えてみろよ。
な)えー、誠に遺憾ながら…
係)(イラッ)
まずはPROCEDURE DIVISIONを組み立てよう
な)え、えーと…こんなふうにFDとSDを考えたと
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を作れって話をしてんだよ。
な)ぐむむ…
作れ言われて簡単に作れたら、そらハッピーでしょうよー、ハッピーターンの魔法の粉のスープでしょうよ
係)いいから、まず中央値の考え方を落とし込めよ。
な)ふむぅ…数字の数が偶数個と奇数個で違うんですよね
奇数と偶数では中央値の求め方が違う
な)数字の数が奇数個だったら、カウント+1で2で割った数が中央値でいいわけで…
そもそも偶数個のときって中央値はどうなるんす?
係)偶数個も同様にカウント+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は4になるし、3.5>Xとしたら、最後のXは3になるわけだし、こういうことっすね!
つまり、個数をカウントからのー、if使って場合分けで…
①奇数だったら、2で割った数字の場所が中央値!
②偶数だったら、2で割った数字は必ずx.5になるからして、それ以下の最大値の整数と、それ以上の最小値の整数の場所の数字を探し出して、足して2で割った数字が中央値!
どうこれ!?天才すぎじゃね、これ!?きゃー!
係)うるさいっての!
だが、まぁ考え方は正しいな。
な)でそ!もうミシガン大卒、名乗れます!?
係)名乗れるかよ!なんでミシガン大学なんだよ⋯
な)ミシガンってゲームがあって!
係)あ、もういいから。
な)え!?
コードはもっと単純に考えられる
係)だがな、中央の場所が3.5とだして、最小値とか最大値とかコードとして書くか?ってことだ。
それだけで、ごちゃごちゃするだろ?
な)うー現実主義…
係)こういうところが腕の見せ所なんだぞ。
な)係長の腕って毛深いっすよね
係)うるさいわ!そういうこと言ってんじゃねーよ!
もっと単純化できないか考えてみろって言ってんだよ!
な)あーそゆことー、係長がもっと単純化して言ってくれればいいのにー
係)ぐっ…
な)単純化いってもなー、3と4を取り出すんでしょー、むむむぅ
あれ?個数の最大値(偶数)を2で割った数字と、それに+1した数字ってことじゃないの?
係)…お前わかっててやってんじゃないだろうな…
な)何いってんす?
だから、1 ~ 6までだから、6で偶数ってことで、6を2で割って3だから3番目とそれに+1した4番目!
これでどうです!?違います!?
係)いいだろう。
な)おー!やはり!
係)そういう流れでPROCEDURE DIVISIONを考えてみろ。
な)あいあいさー!
おむすび
な)…でも、そんな単純なもんじゃないっすよね…
係)そらそうだろ。
でも、ここまでいろいろやってきたんだから、考えることはできるだろ?
な)その考えるっていう作業を俺等は東京湾に捨てちまって、後片付けはAIにやらせちまいましょうぜ、オジキ!
係)誰がオジキだよ!?
な)えー、この方が呼ばれ慣れてるんじゃないんですか?
係)誰にだよ!
な)残念です…(シュン)
係)コードが通らないことを残念がれよ!
(次話へ続く)
係長のワンポイント
中央値は「複雑な条件を並べる処理」じゃない。
本当は、並べたデータの中央位置をどう求めるかという設計だ。
よくある誤解は、偶数なら3.5の前後を探す処理をそのまま書くことだが、それではコードが複雑になる。
だから件数を2で割り、必要な位置だけを整数として取り出せる形へ単純化する。
その結果、奇数と偶数の違いも、中央位置を基準に整理できる。
COBOLは思いついた手順を全部書く言語ではなく、処理を単純な形へ組み直す言語だ。


コメント