【COBOL 書き1-12-6】中央値(偶数版)完成したはずなのに…スーパー戦隊敗れる

🧩今日の学び

・偶数件の中央値は、SORT後の件数から中央の2つの位置を求め、該当する値を取得して平均することで算出できる。
・FDでレコードを定義するだけではファイルを使用できず、FILE-CONTROLのSELECTで実ファイルと結びつける必要がある。
・コンパイルエラーは単なる失敗ではなく、別々に作った定義と処理の間に残った接続漏れを見つける手がかりになる。

なるお)全体をコードにするって一番めんどくさくないです?苦難をより苦難で包むわけですよね。苦難ロールじゃないっすか。中に巻かれてるのはクリームかと思ったら、腐りかけのかにみそみたいな色と味してるじゃないすか。

係長)変な喩えすんな!

もう検討終わったんだから、その結果を形にするだけだろが。

な)そーなんすけど、細かい過去のこと覚えてらんないじゃないっすかー。小鳥さんなみの脳の大きさの自信はあるんで。ハチドリ以上スズメ未満的な。

係)どんだけ小さいんだよ…いらないことは覚えてるくせに。

まぁ、いいからやってみろよ。

な)はーい…

ほら、空もこの憂いの気持ちのようにどんよりとしてる…あの雲から雨の雫が落ちたとき私の命も尽きてしまうの…

係)どんだけ尽きる気だよ…って、もう降ってるぞ。

な)あー、この世とおさらばするんで、帰っても?

係)(ギロリ)

な)あ、寿命が尽きる子鹿に向かって目を剥くんですね…

係)子鹿なのか、小鳥なのかどっちなんだよ!

な)憂いですよ…

係)あっそ、ま、早くやってみせろよ。

な)優しくない!?

ぶー、まったく暖かい血が通ってないんだから

ゼッタイ冷え性だからあの人、間違いないんだから

作った処理を一つのプログラムにまとめる

…んだば、PRECEDUREんとこまとめるっぺか

えーとソーティングがこうで

📝 COBOL ソーティング部
    SORT SORT-FILE
        ON ASCENDING KEY SORT-AMOUNT
        USING INPUT-FILE
        GIVING OUTPUT-FILE.

数を数えるルーピングがこうと

📝 COBOL ルーピング部
    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つ位置決めがこう

📝 COBOL COMPUTE部
           COMPUTE SAKI  = COUNT-LOOPING / 2.
           COMPUTE ATO = SAKI + 1.

そんで2つの位置から値を抜き出すのが…

まずは初期化がこうで

📝 COBOL 2回目ルーピング部その1
           OPEN INPUT OUTPUT-FILE.
           MOVE "N" TO EOF-FLAG.

抜き出しがこう!

📝 COBOL 2回目ルーピング部その2
           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.

で最終の計算と表示でこう

📝 COBOL 計算表示部
   COMPUTE MEDIAN = (SAKIKAZU + ATOKAZU) / 2.
           DISPLAY "MEDIAN IS " MEDIAN.
           STOP RUN.

処理を順番につなげて全体の流れを作る

そんで、超獣合体ライブロボ!

📝 COBOL ソーティング部
    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部にしてたけど、

📝 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).

ワーキングホリデー(WORKING-STORAGE SECTION.)書いてないじゃないのねぇ…

もうこういうの自動で拾って、自動で作ってくれないと困るちゅーの!

現代人は時間が無いのよ!急いで帰って、いぶりがっこクリームチーズまみれを食べなあかんのに!

っと…SAKIとかに文句言ってたご老人がいたから、その人に合わせておくかー

📝 COBOL WORKING-STORAGE SECTION.部
       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だと

係)俺はそんなこと言ってないぞ…

全体コードがついに完成!

な)あれ?これでできたんじゃねこれ?ねぇこれ!

だったら激走合体!アールブイロボ!ってなもんで!

📝 COBOL 中央値(偶数)完成?コード
  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は処理を書く言語ではなく、定義と処理を漏れなくつなげる言語だ。

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

この記事を書いた人

コメント

コメントする

CAPTCHA