試験対策 【過去問題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問でも多く解き、問題に慣れましょう。
<< Back   Index   Next >>  < Top >