🧩今日の学び
・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.
ということだな。
な)あ、配列のスタートとエンドをこっちで設定できれば、途中から、途中までの計算もできるってわけっすか。
係)理解が良いお前は気持ち悪いな⋯
な)どういうこと!?
係)よし、それじゃ形にして、実行してみろ。
な)あいー
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)
な)ふむふむ。ということで⋯
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
で、これをどこに入れる?
な)え…と、計算の前に入れておかないとだから…こう?
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は関数を使う言語じゃない──処理を組み立てる言語だ。


コメント