【COBOL 書き1-8-1】SUMってみよう!配列とループで成長期

🧩今日の学び
SUMは特別な関数ではなく、TOTALを更新し続ける処理の積み重ねで実現できる
・配列(OCCURS)とループ(PERFORM VARYING)を組み合わせることで、同じ処理を効率よく繰り返せる
・COBOLは関数を使う言語ではなく、処理を組み立てて結果を作る言語である

係長)ま、四則演算はいいだろう。次いくぞ。どんどんエクセルでやれることをいくぞ。

なるお)うへ〜

係)やな顔すんな!

次はみんな大好きなサム(SUM)といくか。

な)え?だって、セル無いじゃないっすか⋯できるわけ…

係)COBOLの方が本質だな。

な)はぁ?

目次

SUMの正体は「順番に足しているだけ」

係)ExcelのSUMはこうだな。

💡 ポイント
=SUM(A1:A5)

これで勝手に全部足してくれると。

な)ま、そっすね。

係)これ、中身は何してると思う?

な)中身って…足し算すよね。

係)そうだな。5セル(A1〜E5まで)だとして、どう足しているんだ?

な)え、と、

💡 ポイント
A1 + B1+ C1 + D1 + E1

とかってことじゃないんすか?

係)それは計算しただけだろ?

順を追って、「箱を更新していく」イメージで計算してみろ。

な)あ、だったら、

💡 ポイント
A2 = A1 + A2
A3 = A2 + A3
A4 = A3 + A4
A5 = A4 + A5

ってなって、ADDを繰り返すってことっすよね?

係)いいぞ。

ただ、合計を入れるための専用の変数(TOTAL)をたてておくとするとどうなる?

合計は「TOTALを更新し続ける」

な)こうっすか?

💡 ポイント
TOTAL = A1
TOTAL = TOTAL + A2
TOTAL = TOTAL + A3
TOTAL = TOTAL + A4
TOTAL = TOTAL + A5

係)そういうことにはなるんだが、ここで「配列」と「ループ」を覚えてるかって話になるぞ。

な)配列とルーピングっすか … やったことは覚えてますけど…書けって言われても…です。

係)まぁ、そうだろうな。

だが、同じ計算を続けるということは、配列を使って同じ計算をループできれば、サム(合計)になるだろ? ってことだ。

つまり、お前が考えたさっきの流れがこうだったらどうだ?

💡 ポイント
TOTAL = 0
TOTAL = TOTAL + N(1)
TOTAL = TOTAL + N(2)
TOTAL = TOTAL + N(3)
TOTAL = TOTAL + N(4)
TOTAL = TOTAL + N(5)

※N(1)〜N(5) は配列の要素

な)最初からルーピングで回せるってことっすか?

係)ということだ。

その流れを説明するぞ。

配列とループでSUMを作る

係)まずは配列のデータを作るぞ。5つの値を足していくとして、

💡 ポイント
01 NUMS.
    05 N PIC 9(3) OCCURS 5 TIMES.

な)あ、おかず。

係)なんだよ、おかず(OCCURS)って…

そしてだな、合計していくための箱(TOTAL)と、ループを回すためのカウンタ(I)を用意すると。

💡 ポイント
01 I PIC 9(2).
01 TOTAL PIC 9(5) VALUE 0.     → 最初に0にしておく

これを、足し算で回す

💡 ポイント
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
    ADD N(I) TO TOTAL
END-PERFORM.

ということだな。

な)あ、配列のスタートとエンドをこっちで設定できれば、途中から、途中までの計算もできるってわけっすか。

係)理解が良いお前は気持ち悪いな⋯

な)どういうこと!?

係)よし、それじゃ形にして、実行してみろ。

な)あいー

📝 COBOL sample.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. SUM-TEST.

DATA DIVISION.
WORKING-STORAGE SECTION.

01 NUMS.
    05 N PIC 9(3) OCCURS 5 TIMES......

あれ?

配列の箱を作るのは良いんですけど、それぞれの箱に足し算するための値も指定しておかないとですよね?

係)そうだな。PROCEDURE DIVISION内にそれぞれの箱に値をいれていく、でいいぞ。

💡 ポイント
    MOVE 1 TO N(1)
    MOVE 2 TO N(2)
    MOVE 3 TO N(3)
    MOVE 4 TO N(4)
    MOVE 5 TO N(5)

な)ふむふむ。ということで⋯

📝 COBOL sample.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. SUM-TEST.

DATA DIVISION.
WORKING-STORAGE SECTION.

01 NUMS.
    05 N PIC 9(3) OCCURS 5 TIMES.

01 I PIC 9(2).
01 TOTAL PIC 9(5) VALUE 0.

PROCEDURE DIVISION.

    MOVE 1 TO N(1)
    MOVE 2 TO N(2)
    MOVE 3 TO N(3)
    MOVE 4 TO N(4)
    MOVE 5 TO N(5)

    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
        ADD N(I) TO TOTAL
    END-PERFORM.

    DISPLAY TOTAL.

    STOP RUN.

ってことすかね。んで、実行っと。

💻 ターミナル出力 実行結果
00015

あ、でた!

1 + 2 + 3 + 4 + 5だから15ということになると。

係)これでいいな。

初期化もループで書ける

な)でもでもデモクラシーですよ、ここの部分、

💡 ポイント
    MOVE 1 TO N(1)
    MOVE 2 TO N(2)
    MOVE 3 TO N(3)
    MOVE 4 TO N(4)
    MOVE 5 TO N(5)

ここも全部指定するんじゃなくって、ルーピングじゃだめなんすかね?

係)む…。

ループでいいぞ、書き方としてはこうだ。

💡 ポイント
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
    MOVE I TO N(I)
END-PERFORM

で、これをどこに入れる?

な)え…と、計算の前に入れておかないとだから…こう?

📝 COBOL sample.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. SUM-TEST.

DATA DIVISION.
WORKING-STORAGE SECTION.

01 NUMS.
    05 N PIC 9(3) OCCURS 5 TIMES.

01 I PIC 9(2).
01 TOTAL PIC 9(5) VALUE 0.

PROCEDURE DIVISION.

    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
        MOVE I TO N(I)
    END-PERFORM.

    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
        ADD N(I) TO TOTAL
    END-PERFORM.

    DISPLAY TOTAL.

    STOP RUN.

で、実行して……あ、出た!

💻 ターミナル出力 実行結果
00015

おむすび

係)よし、合格だな。

これでお前はExcelのSUMを自分で作ったんだぞ。もう少し喜べよ。

な)だって、係長が作ったコードを組み合わせただけだし⋯

係)大丈夫だ。

な)え、係長が優しいなんて…そんなに俺の成長を喜んで⋯涙ぐむなんて…。

係)誰が涙ぐんでんだよ!

な)えー、号泣してくださしよー。

係)うるさいな。

次の応用編は、お前が書くんだからな。

な)えぇ!?

係長のワンポイント

配列は「箱が並んでいる状態」だ。
ループは「同じ処理を順番に回す仕組み」だ。
SUMはその2つを組み合わせただけにすぎない。
TOTALを更新し続けることで、合計が出来上がる。
COBOLは関数を使う言語じゃない──処理を組み立てる言語だ。

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

この記事を書いた人

コメント

コメントする

CAPTCHA


目次