平成12年秋
問8 次のCOBOLプログラムの説明及びプログラムを読んで、設問に答えよ。
〔プログラムの説明〕
店舗別、部門別に部門販売額を登録した販売ファイルから、部門ごとに部門販売額の大きい順に順位を付け、販売成績ファイルを作成する。
(1) 販売ファイルのレコード様式は、次のとおりである。
@各店舗には、部門 A〜E の 5 部門がある。
A販売ファイル中に同一の店舗コードをもつレコードは、ないものとする。
B部門販売額は、9けたを超えないものとする。
C販売ファイルのレコード数は、9,999件以下とする。
(2) 販売成績ファイルのレコード様式は、次のとおりである。
@各部門の部門順位は、各店舗の同一部門の部門販売額の大きい順に1から付ける。
A部門販売額が同一の店舗が複数ある場合は、同じ部門順位とする。同じ部門順位を付けた後の順位は、それまでに順位をつけた店舗数より1だけ大きい数とする。
(3) 部門別の部門販売額の順位を求めるため、作業用のファイルを用いる。
〔プログラム〕←クリック
設問 プログラム中の![]() a、d に関する解答群 ア BANGO-BAN イ BANGO-SOR ウ BUMON-BAN エ BUMON-SOR オ GAKU-BAN カ GAKU-SOR キ TENPO-BAN ク TENPO-SOR b に関する解答群 ア MOVE BANGO-REC TO SORT-REC イ MOVE GAKU-WRK TO GAKU-SOR ウ READ SORT-FILE エ RELEASE SORT-REC オ RETURN SORT-FILE カ WRITE SORT-REC c に関する解答群 ア MOVE BUMON-SOR TO LCN イ MOVE LCN TO BUMON-SOR ウ MOVE X TO BANGO-BAN エ MOVE X TO Y オ MOVE Y TO BANGO-BAN カ MOVE Y TO X e に関する解答群 ア TENPO-SEI = TENPO-BAN イ TENPO-SEI NOT = TENPO-BAN ウ TENPO-SEI = TENPO-SOR エ TENPO-SEI NOT = TENPO-SOR オ TENPO-SOR = TENPO-BAN カ TENPO-SOR NOT = TENPO-BAN 【解答】 a:ク b:エ c:エ d:エ e:エ 【解説】時間なかったのである解説書からのパクリました。暇になったらわかり易く書き直します。次問題はちゃんと私が解説してますので。これよりは理解できるかと思いますが。 このCOBOLプログラムでは、SORT命令により2回のソートが行われている。 (1)1回目のSORT文では、 @ソート前に入力手続としてBUNKAI-RTNを行った後 ASORT-FILEを部門BUMON-SORの昇順に、部門販売額GAKU-SORの降順にソート Bソート後に出力手続としてBANGO-RTNを行っている (2)2回目のSORTでは、 @USING句により作業用のBANGO-FILEを入力ファイルとしてSORT-FILE に書出し、 A空欄aをソートキーとして昇順にソート Bソート後に出力手続としてMATOME-RTNを行っている 1回目のSORT文における入力手続BUNKAI-RTNについて 販売ファイルHANBAI-FILEのレコードを1件ずつ読み、AT ENDになるまで 以下の処理を繰り返している。HANBAI-FILEの1レコード中の5つの部門の 部門別販売額を、店舗別部門別に5つのレコードに分解して、SORT-FILEに 書出している処理が空欄bを含むPERFORM文の処理に相当する。したがっ て空欄bは、RELEASE文によるSORT-FILEへの書出しに該当し、RELEASE SORT-RECつまり解答群のエが正解。 ![]() 1回目のSORT文における出力手続BANGO-RTNについて ソート済みSORT-FILEのレコードを1件ずつ読み、AT ENDになるまで以下 の処理を繰り返している。 @LCN=BUMON-SORのとき、つまり部門が同じレコードが出現するごとに 1)変数Xをカウントアップ 2)GAKU-WRK>GAKU-SORのときだけ SORT-FILEから読込んだ部門別販売額GAKU-SORをその保存エリア GAKU-WRKにセットし、さらに空欄cの処理を行っている 3)このIF文直後のMOVE文により、変数Yが作業ファイルの部門順位 BANGO-BANにセットされている。 したがって変数Yは同一部門内での販売額の部門順位をカウントする変数 であり、直前の部門販売額GAKU-WRKより小さくなったときにだけ、同一 部門内のそれまで順位をつけた店舗数より1だけ大きな数で順位Yを更新 する必要がある。これが空欄cでの処理に該当する。 同一部門内のそれまでに順位をつけた店舗数は、COMPUTE文により変数 Xがカウントアップされている。したがって空欄cでこの変数Xを変数Y にセットすればよく、“MOVE X TO Y”つまり解答群のエが正解。 ALCN≠BUMON-SORのとき、つまり異なる部門のレコードが出現したとき 1)部門別販売額GAKU-SORをその保存エリアにセット 2)部門BUMON-SORを保存エリアLCNのにセット 3)変数X、Y、部門順位BANGO-BANを1に初期設定 B作業用ファイルBANGO-FILEに出力している 2回目のSORT文について USING句により作業用のBANGO-FILEを入力ファイルとしてSORT-FILEに 書出して、ソート後、出力手続MATOME-RTNで成績ファイルSEISEKI-FILE に出力するためには、店舗コードTENPO-SORの昇順にSORT-FILEをソート しておく必要がある。したがって空欄aにおけるソートキーはTENPO-SORの 昇順とすればよく、解答群のクが正解。 2回目のSORT文における出力手続MATOME-RTNについて 店舗コードTENPO-SORの昇順にソート済みのSORT-FILEを1レコードずつ 読み、各店舗ごとに5つの部門のレコードを1レコードに合成し、各店舗コード ごとに成績ファイルSEISEKI-FILEとして出力している処理に相当する。 SORT-FILEのレコードは、店舗コードTENPO-SORごとに、1〜5の部門コー ドBUMON-SORとその部門販売額GAKU-SORが出現するので、SEISEKI-FILE の店舗コードTENPO-SEIごとに、出現した部門コードBUMON-SORに応じて、 出現順にBANGO-SEI(BUMON-SOR)、GAKU-SEI(BUMON-SOR)に5部門の 部門コードと部門販売額をセットすればよい。したがって空欄dはBUMON-SOR つまり解答群のエが正解。 空欄eは、成績ファイルにレコードを出力するタイミングに関する条件で、 SORT-FILEのレコードの店舗コードTENPO-SORが直前の店舗コードと変わっ たときに出力すればよい。直前の店舗コードは成績ファイルのTENPO-SEIにセ ットされているので、IF文の条件は、“TENPO-SEI NOT = TENPO-SOR” とすればよい。したがって解答群のエが正解。 <参考> このプログラムでは、SORT命令が使用されているので、SORT命令について復習します。COBOLにおけるSORT命令の一般的な形式は以下の4つのパターンに分類されます。ソートの直前、直後にデータを加工する処理があるか否かにより、以下に分類されます。 (1)単純ソート(ソートの直前、直後に入力手続、出力手続がないソート) SORT ソートファイル名 ON ASCENDING KEY ソートキー (昇順ソートの場合) USING 入力ファイル名 GIVING 出力ファイル名 SORT ソートファイル名 ON DESCENDING KEY ソートキー (降順ソートの場合) USING 入力ファイル名 GIVING 出力ファイル名 ![]() (2)ソートの直前、直後にそれぞれ入力手続、出力手続があるソート) SORT ソートファイル名 ON ASCENDING KEY ソートキー (昇順ソートの場合) INPUT PROCEDURE IS 入力手続名 OUTPUT PROCEDURE IS 出力手続名 入力手続名. RELEASE ソートファイルのレコード名 FROM 〜 (入力手続で処理されたレコードをソートファイルに書き出せる) 出力手続名. RETURN ソートファイル名 AT END 〜 (ソート済みファイルを出力手続で読込むことができる) ![]() (3)ソートの直前に入力手続があり、直後には出力手続がないソート) SORT ファイル名 ON ASCENDING KEY ソートキー (昇順ソートの場合) INPUT PROCEDURE IS 入力手続名 GIVING 出力ファイル名 入力手続名. RELEASE ソートファイルのレコード名 FROM 〜 (4)ソートの直前には入力手続がなくて、直後には出力手続があるソート) SORT ファイル名 ON ASCENDING KEY ソートキー (昇順ソートの場合) USING 入力ファイル名 OUTPUT PROCEDURE IS 出力手続名 出力手続名. RETURN ソートファイル名 AT END 〜 |