🧩今日の学び
・偶数件の中央値は、SORT後の件数から中央の2つの位置を求め、該当する値を取得して平均することで算出できる。
・FDでレコードを定義するだけではファイルを使用できず、FILE-CONTROLのSELECTで実ファイルと結びつける必要がある。
・コンパイルエラーは単なる失敗ではなく、別々に作った定義と処理の間に残った接続漏れを見つける手がかりになる。
なるお)全体をコードにするって一番めんどくさくないです?苦難をより苦難で包むわけですよね。苦難ロールじゃないっすか。中に巻かれてるのはクリームかと思ったら、腐りかけのかにみそみたいな色と味してるじゃないすか。
係長)変な喩えすんな!
もう検討終わったんだから、その結果を形にするだけだろが。
な)そーなんすけど、細かい過去のこと覚えてらんないじゃないっすかー。小鳥さんなみの脳の大きさの自信はあるんで。ハチドリ以上スズメ未満的な。
係)どんだけ小さいんだよ…いらないことは覚えてるくせに。
まぁ、いいからやってみろよ。
な)はーい…
ほら、空もこの憂いの気持ちのようにどんよりとしてる…あの雲から雨の雫が落ちたとき私の命も尽きてしまうの…
係)どんだけ尽きる気だよ…って、もう降ってるぞ。
な)あー、この世とおさらばするんで、帰っても?
係)(ギロリ)
な)あ、寿命が尽きる子鹿に向かって目を剥くんですね…
係)子鹿なのか、小鳥なのかどっちなんだよ!
な)憂いですよ…
係)あっそ、ま、早くやってみせろよ。
な)優しくない!?
ぶー、まったく暖かい血が通ってないんだから
ゼッタイ冷え性だからあの人、間違いないんだから
作った処理を一つのプログラムにまとめる
…んだば、PRECEDUREんとこまとめるっぺか
えーとソーティングがこうで
SORT SORT-FILE
ON ASCENDING KEY SORT-AMOUNT
USING INPUT-FILE
GIVING OUTPUT-FILE.
数を数えるルーピングがこうと
OPEN INPUT OUTPUT-FILE.
PERFORM UNTIL EOF-FLAG = "Y"
READ OUTPUT-FILE
AT END
MOVE "Y" TO EOF-FLAG
NOT AT END
ADD 1 TO COUNT-LOOPING
END-READ
END-PERFORM.
CLOSE OUTPUT-FILE.
んで、中央の2つ位置決めがこう
COMPUTE SAKI = COUNT-LOOPING / 2.
COMPUTE ATO = SAKI + 1.
そんで2つの位置から値を抜き出すのが…
まずは初期化がこうで
OPEN INPUT OUTPUT-FILE.
MOVE "N" TO EOF-FLAG.
抜き出しがこう!
PERFORM UNTIL EOF-FLAG = "Y"
READ OUTPUT-FILE
AT END
MOVE "Y" TO EOF-FLAG
NOT AT END
ADD 1 TO READ-COUNT
IF READ-COUNT = SAKI
MOVE OUTPUT-AMOUNT TO SAKIKAZU
END-IF
IF READ-COUNT = ATO
MOVE OUTPUT-AMOUNT TO ATOKAZU
END-IF
END-READ
END-PERFORM.
CLOSE OUTPUT-FILE.
で最終の計算と表示でこう
COMPUTE MEDIAN = (SAKIKAZU + ATOKAZU) / 2.
DISPLAY "MEDIAN IS " MEDIAN.
STOP RUN.
処理を順番につなげて全体の流れを作る
そんで、超獣合体ライブロボ!
SORT SORT-FILE
ON ASCENDING KEY SORT-AMOUNT
USING INPUT-FILE
GIVING OUTPUT-FILE.
OPEN INPUT OUTPUT-FILE.
PERFORM UNTIL EOF-FLAG = "Y"
READ OUTPUT-FILE
AT END
MOVE "Y" TO EOF-FLAG
NOT AT END
ADD 1 TO COUNT-LOOPING
END-READ
END-PERFORM.
CLOSE OUTPUT-FILE.
COMPUTE SAKI = COUNT-LOOPING / 2.
COMPUTE ATO = SAKI + 1.
OPEN INPUT OUTPUT-FILE.
MOVE "N" TO EOF-FLAG.
PERFORM UNTIL EOF-FLAG = "Y"
READ OUTPUT-FILE
AT END
MOVE "Y" TO EOF-FLAG
NOT AT END
ADD 1 TO READ-COUNT
IF READ-COUNT = SAKI
MOVE OUTPUT-AMOUNT TO SAKIKAZU
END-IF
IF READ-COUNT = ATO
MOVE OUTPUT-AMOUNT TO ATOKAZU
END-IF
END-READ
END-PERFORM.
CLOSE OUTPUT-FILE.
COMPUTE MEDIAN = (SAKIKAZU + ATOKAZU) / 2.
DISPLAY "MEDIAN IS " MEDIAN.
STOP RUN.
武装頭脳軍に勝っちゃいますよ!これ!頭脳に武装したところでですよ!勝つのは頭脳より勢いなんすよ!
係)なに言ってんだ…
必要な変数はWORKING-STORAGEにまとめる
な)んで、これ最終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).
ワーキングホリデー(WORKING-STORAGE SECTION.)書いてないじゃないのねぇ…
もうこういうの自動で拾って、自動で作ってくれないと困るちゅーの!
現代人は時間が無いのよ!急いで帰って、いぶりがっこクリームチーズまみれを食べなあかんのに!
っと…SAKIとかに文句言ってたご老人がいたから、その人に合わせておくかー
WORKING-STORAGE SECTION.
01 EOF-FLAG PIC X VALUE "N".
01 COUNT-LOOPING PIC 9(2) VALUE 0.
01 READ-COUNT PIC 9(2) VALUE 0.
01 LOW-POS PIC 9(2) VALUE 0.
01 HIGH-POS PIC 9(2) VALUE 0.
01 LOW-VAL PIC 9(5) VALUE 0.
01 HIGH-VAL PIC 9(5) VALUE 0.
01 MEDIAN-VAL PIC 9(5)V9 VALUE 0.
こんな感じかな…あとでPROCEDURE部も直さないとだに…ほんと一人のクレーマーで手間が増えるこの時代どうなのよ!
係)いちいち文句が絶えないやつだな…
ま、処理を先に考えたから、必要な変数が見えただろ。ソースの並びと、考える順番は同じじゃなくていいからな。
な)ほーほー。私は優秀だと(メモメモ)Awesomeだと
係)俺はそんなこと言ってないぞ…
全体コードがついに完成!
な)あれ?これでできたんじゃねこれ?ねぇこれ!
だったら激走合体!アールブイロボ!ってなもんで!
1 IDENTIFICATION DIVISION. 2 PROGRAM-ID. NARUO. 3 4 ENVIRONMENT DIVISION. 5 INPUT-OUTPUT SECTION. 6 FILE-CONTROL. 7 SELECT INPUT-FILE 8 ASSIGN TO "naruo2.txt" 9 ORGANIZATION IS LINE SEQUENTIAL. 10 SELECT SORT-FILE 11 ASSIGN TO "sortwork.tmp". 12 13 DATA DIVISION. 14 FILE SECTION. 15 FD INPUT-FILE. 16 01 INPUT-RECORD. 17 05 INPUT-SALE-DATE PIC X(10). 18 05 INPUT-ITEM-NAME PIC X(20). 19 05 INPUT-AMOUNT PIC 9(5). 20 SD SORT-FILE. 21 01 SORT-RECORD. 22 05 SORT-SALE-DATE PIC X(10). 23 05 SORT-ITEM-NAME PIC X(20). 24 05 SORT-AMOUNT PIC 9(5). 25 FD OUTPUT-FILE. 26 01 OUTPUT-RECORD. 27 05 OUTPUT-SALE-DATE PIC X(10). 28 05 OUTPUT-ITEM-NAME PIC X(20). 29 05 OUTPUT-AMOUNT PIC 9(5). 30 WORKING-STORAGE SECTION. 31 01 EOF-FLAG PIC X VALUE "N". 32 01 COUNT-LOOPING PIC 9(2) VALUE 0. 33 01 READ-COUNT PIC 9(2) VALUE 0. 34 01 LOW-POS PIC 9(2) VALUE 0. 35 01 HIGH-POS PIC 9(2) VALUE 0. 36 01 LOW-VAL PIC 9(5) VALUE 0. 37 01 HIGH-VAL PIC 9(5) VALUE 0. 38 01 MEDIAN-VAL PIC 9(5)V9 VALUE 0. 39 40 PROCEDURE DIVISION. 41 SORT SORT-FILE 42 ON ASCENDING KEY SORT-AMOUNT 43 USING INPUT-FILE 44 GIVING OUTPUT-FILE. 45 46 OPEN INPUT OUTPUT-FILE. 47 PERFORM UNTIL EOF-FLAG = "Y" 48 READ OUTPUT-FILE 49 AT END 50 MOVE "Y" TO EOF-FLAG 51 NOT AT END 52 ADD 1 TO COUNT-LOOPING 53 END-READ 54 END-PERFORM. 55 CLOSE OUTPUT-FILE. 56 57 COMPUTE LOW-POS = COUNT-LOOPING / 2. 58 COMPUTE HIGH-POS = LOW-POS + 1. 59 60 OPEN INPUT OUTPUT-FILE. 61 MOVE "N" TO EOF-FLAG. 62 PERFORM UNTIL EOF-FLAG = "Y" 63 READ OUTPUT-FILE 64 AT END 65 MOVE "Y" TO EOF-FLAG 66 NOT AT END 67 ADD 1 TO READ-COUNT 68 IF READ-COUNT = LOW-POS 69 MOVE OUTPUT-AMOUNT TO LOW-VAL 70 END-IF 71 IF READ-COUNT = HIGH-POS 72 MOVE OUTPUT-AMOUNT TO HIGH-VAL 73 END-IF 74 END-READ 75 END-PERFORM. 76 CLOSE OUTPUT-FILE. 77 78 COMPUTE MEDIAN-VAL = (LOW-VAL + HIGH-VAL) / 2. 79 DISPLAY "COUNT=" COUNT-LOOPING 80 " LOW-POS=" LOW-POS " HIGH-POS=" HIGH-POS. 81 DISPLAY "LOW-VAL=" LOW-VAL " HIGH-VAL=" HIGH-VAL. 82 DISPLAY "MEDIAN IS " MEDIAN-VAL. 83 STOP RUN.
きゃーできたー!喜び勇んで実行へ!
係)「喜び勇んで」を声に出すやついないだろ…
ま、どら…、ふ…ん…
な)なんかいつもの不穏で嫌な感じ…
係)ま、実行すればわかるだろ。
コンパイルして初めて本当の答えが分かる
な)ふん!見ていやがれってんだぃ!
係)お前どこの生まれなんだよ…
な)実行!
ぎゃびー!!

全力は尽くしましたが…残念です…
係)「残念です…」じゃねーんだよ!直す義務がお前にあるんだよ!
おむすび
な)いやー!!もう御臨終なされたんすよ!逝去されたんすよ!こぼるんとともに!
係)うるさいわ!
いいか!これ終わらせないと帰れないと思え!
な)いやー!!
…あ、そういえば、今からじーちゃんが生き返るって言うんで、あれなんで。
祈祷会に出なきゃいけないんで、白装束着なきゃいけないんで、あれなんで、ええ。
係)さっさと見直せよ!
な)みゅうつー!!
(次回に続く)
係長のワンポイント
完成コードは「部品を順番に並べたもの」ではない。
すべての定義と処理が、正しく結びついて初めて一つのプログラムになる。
よくある誤解は、処理部分が完成すれば動くと思うことだが、ファイルは使う前に環境定義も必要だ。
だから OUTPUT-FILE をFDで作るだけでは足りず、FILE-CONTROLでも実ファイルと結びつけなければならない。
その結果、コンパイルは失敗ではなく、設計から抜け落ちた接続部分を教えてくれる。
COBOLは処理を書く言語ではなく、定義と処理を漏れなくつなげる言語だ。


コメント