試験対策 【過去問題1】
出題時期は忘れました…
【問題】
次のCOBOLプログラムの説明及びプログラムを読んで設問に答えよ
[プログラムの説明]
電話の発信ごとに作成された電話料金記録のファイル(電話料金ファイル)がある。この電話料金ファイルを入力して、利用部署別、利用年月別の電話料金の集計を行い、集計ファイルを作成するプログラムである。
(1)電話料金ファイルのレコード様式は図1のとおりである。
利用年月日
6けた
|
利用部署
2けた
|
電話料金
7けた
|
その他の情報
65けた
|
図1 電話料金ファイルのレコード様式
(2)集計ファイルのレコード様式は図2のとおりである。
利用部署
2けた
|
利用年月
4けた
|
電話料金計
10けた
|
図2 集計ファイルのレコード様式
(3)電話料金ファイルの利用年月日の年は、西暦年の下2けたとする。
(例:1992年1月1日 → 920101)
(4)電話料金ファイルの内容は、全て正しいものとする。
(5)集計ファイルには、利用部署、利用年月の昇順に出力する。
(6)集計ファイルの電話料金計は、10けたでよいものとする。
[プログラム] ←クリック!
[設問]
プログラム内の■■■■■■を埋めて、プログラムを完成せよ。ただし演算にはCOMPUTE文を用い、比較演算子には、<,<=,>,>=,=,NOTを用いること。
なお、一つの■■■■■■内に二つ以上の文を書いてはならない。
さあこの問題が自力で解けますか?まずは自力で解いてみましょう。
解き終わった人から順に解答を見て下さいね。いきなりギブアップじゃ意味ないですから。
[解答例]
まず最初にプログラムを見た途端、少し戸惑いませんでしたか?そうです。試験問題は余計な部分はゴッソリ削ぎ落とし、省略可能な個所はキッチリ省略して出題されます。各命令文の空白ですら1コしか空けません。見づらいです非常に。
見出し部(IDENTIFICATION DIVISION)と環境部(ENVIRONMENT DIVISION)は省略されています。この出題には特に無くても設問の意味が伝わるためでしょう。
それでは、手続き部(PROCEDURE DIVISION)以降を順に解説します。
PROC-MAIN. 始まりです。任意の名前。特に意味はもちません。
まず、このプログラムで戸惑うのがSORT文。データの並び替え命令です。あまり普段のプログラムで使用することはありません。COBOLの出題者はSORT文が好きなようで、3年に1度ぐらい出題されます。
構文は次の通り
SORT 並び替え後の格納ファイル
ON ASCENDING(昇順) KEY 第一Key項目 第二Key項目 …第NKey項目
USING 入力ファイル
OUTPUT PROCEDURE IS 処理ルーチン.
とまあ、こんな感じになります。
なお降順の並び替えならばASCENDINGをDECENDINGに変更するだけです。
入力ファイルを読み込んで、作業ファイルに格納し、それを処理ルーチンが終わるまで続けなさい、という意味です。でも普通なら、プログラムの前にSORTは済ましておきますよ、普通ならね。ただ出題者側としては、敢えて現在使わないような文法を使って、合格者を減らそうとしてきます。悪質です。性悪ですね。きっと白衣とか着てますよ、アインシュタインて陰口叩かれてると思います。ええ間違いないです。というわけで、
(1)の解答は USING INPUT-F となります。
次の段落に行きます。
SHUKEI. なんですかこのネーミングセンスは。
こまわり君かよって話ですよ。それ死刑! ねぇ、お前が死ねとか言わないで下さい。集計の意味なんでしょう。あはは小学生以下ですわ。あほか。
問題の内PERFORMに行きましょう。
みんなこの文を理解できるでしょうか?念のために解説します。
PERFORM UNTIL OWARI = 1
OWARIが1になるまでEND-PERFORMまでを繰り返せ
RETURN SORT-F
READ文と同じだと思って構いません
・
・
END-PERFORM
ここの処理で何を行なう必要があるか一度整理してみましょう。
・集計ファイル用に電話料金の合計を求める
そうです、よくわかりましたね!と、寒い一人芝居。
ざっと処理を見てみると、入力ファイルを読み(部署と年月で昇順済み)、同一の部署&年月の場合は●●し、部署か年月が変わったらKAKIDASHI(書き出し処理)に飛び、各ワーク項目を初期化する、となっています。
では●●には何が当てはまるか?そう、集計ファイル用に電話料金の合計を求めなければなりません。
ですから答えは、 ADD S-GAKU TO W-GAKU-KEI として、ワークのW-GAKU-KEIに加算すればOK!!
ダッダッダッダ… 「ちょっと待った〜」 おーっとチョット待ったコールだ〜
(古くてスミマセン)
問題の設問をよく読んで下さい。〜ただし演算にはCOMPUTE文を用い〜 となっています。つまりADDでも文法上間違いではないのですが、この白衣のジジイはまた罠を仕掛けてあります。浅はかな考えです。よって、
(2)の解答は COMPUTE W-GAKU-KEI = S-GAKU + W-GAKU-KEI
が正解になります。
いよいよ最後の処理です。KAKIDASHI.ジジイとことん舐めてますねネーミング。
ここは単純にワークの項目を出力レコードにブチ込んで書くだけ。
ただIF文が先頭についているのが気になります。さあ何のためでしょうか?
ヒント:もし仮に入力データが0件でこの処理を流すとどうなりますか?
わかりましたか?そうですね正解です。入力ファイルがゼロ件で処理した場合でも、このKAKIDASHIは通過してしまいます。
(AT END条件にKAKIDASHIへのPERFORM文があるため)
このIF文が無いと、入力ゼロ件なのに出力は1件、しかも中身は保証されないヘンテコなデータができちまいます。ここでIF文を設ける事により、ゼロ件の場合でも書き込みを行なわないように細工してるんです。
ジジイの考えそうなことです。私ならもっとマシなソースコード書きます。
でわ、この(3)には何が入るか考えましょう。
ZZZ… はっ!寝ちゃいました。できましたか?
その通り。このプログラム内で入力件数がゼロの場合、唯一値に変化がないのはW-YMだけです。W-GAKU-KEIやW-BUは初期値が指定されていない為、条件文で判断できません。W-YMは初期値としてLOW-VALUEが指定されているため、仮にゼロ件で処理された場合、KAKIDASHIに飛んでもLOW-VALUEのままですね。よって
(3)の解答は W-YM NOT = LOW-VALUE となります。
楽勝でしたか?ギャグが寒すぎてムカつきました?ゴメンナサイ、こんな私です。
次ページにはCOBOLの過去問題を掲載しておきます。1問でも多く解き、問題に慣れましょう。