基本情報技術者 2012年 秋期 午後 問10
次のCOBOLプログラムの説明及びプログラムを読んで、設問1,2に答えよ。
〔プログラムの説明〕
ある会員制スポーツクラブにおける利用料金の計算プログラムである。
このスポーツクラブは、会員が都合の良い時間に施設を利用できるようになっており、会員の利用実績を利用記録ファイルに格納する。利用料金は、1か月に10時間まで利用できる基本料金と、10時間を超過した時間に応じて課金する超過料金の合計であり、1か月分をまとめて、翌月、会員に請求する。施設の利用実績がなかった会員にも、基本料金は請求する。
(1) 会員ファイルは、図1に示すレコード様式の索引ファイルであり、会員番号を主レコードキーとする。呼出し法は順呼出しとする。

① 会員番号は、会員ごとに割り当てられる一意の番号であり、000001から始まる6桁の数字である。
② 会員種別には、表1に示す会員種別が格納される。利用料金は、会員種別によって決まる。

③ 入会日には、入会した年、月、日が、それぞれ4桁、2桁、2桁で格納される。
(2) 利用記録ファイルは、図2に示すレコード様式の順ファイルであり、1か月分の会員の利用実績を格納する。1レコードには、1人の会員の1回の利用に関する情報が格納される。

① 利用日には、施設を利用した年、月、日が、それぞれ4桁、2桁、2桁で格納される。
② 開始時刻及び終了時刻には、時、分がそれぞれ2桁の24時間表記で格納される。施設の営業時間は8時から23時までである。
③ 利用時間には、施設の利用時間が分単位で格納される。
(3) 請求ファイルは、図3に示すレコード様式の順ファイルであり、会員ごとの月次請求金額を格納する。超過料金は1か月の利用時間の合計(分)を時間単位に切り上げて課金する。

(4) 作業用ファイルは、図4に示すレコード様式の索引ファイルであり、会員番号を主レコードキーとする。利用記録ファイルから会員ごとの利用時間の合計を分単位で求めるために使用する。呼出し法は乱呼出しとする。

設問1:
問題文を見る プログラム中のに入れる正しい答えを、解答群の中から選べ。
aに関する解答群
ア:"300400400500"
イ:"400400500500"
ウ:"500400400300"
エ:"500500400300"
bに関する解答群
ア:MAIN-PROC
イ:MKBILL-PROC
ウ:MKTIME-PROC
エ:MKWORK-PROC
オ:WRBILL-PROC
c, dに関する解答群
ア:ADD EXT-PRICE(M-CODE) TO B-CHG
イ:ADD T-MIN TO W-MIN
ウ:COMPUTE B-CHG = B-CHG + EXT-PRICE(M-CODE) * EXT-H
エ:COMPUTE W-MIN = (T-MIN + 59) / 60 + 1
オ:MOVE EXT-PRICE(M-CODE) TO B-CHG
カ:MOVE T-MIN TO W-MIN
模範解答
a:ウ、b:イ、c:カ、d:ウ
解説
解答の導き方
この問題では、料金表の値を並べる場所、利用時間を集計する処理、請求金額を計算する処理を、プログラムの流れに沿って確認します。
a:料金表の並びを確認します
COBOL(COmmon Business-Oriented Language:事務処理向けのプログラミング言語)では、同じデータを別の形で扱うために、REDEFINESを使うことがあります。このプログラムでは、PRICE-VALUEの文字列を、PRICE-TABLEで料金の配列(同じ種類のデータを並べたもの)として扱っています。
まず、行34の「5000500040003000」は、基本料金を4桁ずつに分けたものです。
行35は、超過料金を3桁ずつ4つ並べた値です。表1によると、会員種別1から順に、超過料金は500、400、400、300です。したがって、行35に入る文字列は「500400400300」となり、aはウです。
b:請求処理を呼び出す場所を確認します
MAIN-PROCでは、行44でMKTIME-PROCを実行し、その後、行45で空欄の処理を実行してから、ファイルを閉じています。
MKTIME-PROCは、利用記録を読み、会員ごとの利用時間を作業用ファイルに集計する処理です。その集計結果を使って請求ファイルを作る処理は、MKBILL-PROCです。実際にMKBILL-PROCの中では会員ファイルを読み、会員ごとの請求処理であるWRBILL-PROCを呼び出しています。
そのため、bにはMKBILL-PROCが入り、選択肢はイです。先に利用時間を集計し、その後に請求額を計算する順番になっています。
c:初めて利用記録が見つかったときの処理を確認します
作業用ファイルは索引ファイル(キーを使って目的のレコードを探せるファイル)で、会員番号が主レコードキー(レコードを特定するための項目)です。プログラムは利用記録を1件読むたびに、その会員番号で作業用ファイルを読みます。
- すでに同じ会員番号のレコードがある場合は、行60でT-MINをW-MINに加えます。
- レコードがない場合は、行57以降のINVALID KEY側に進みます。
初めてその会員の利用記録を処理する場合、まだ合計時間はありません。そこで、今回の利用時間T-MINをW-MINに入れてから、レコードを作成する必要があります。たとえば、最初の利用時間が75分なら、最初のW-MINは75分にします。次の利用時間が40分なら、既存の合計に加えて115分にします。
このため、cには「MOVE T-MIN TO W-MIN」が入り、選択肢はカです。初回は値を設定し、2回目以降は値を加算する、という使い分けです。
d:基本料金に超過料金を加える処理を確認します
WRBILL-PROCでは、まず会員種別に対応する基本料金をB-CHGに入れています。次に作業用ファイルを読み、1か月の利用時間の合計W-MINが600分を超えているかを調べます。600分は10時間分です。
600分を超えた場合、行77で超過分の時間数EXT-Hを計算しています。超過分を分単位から時間単位に切り上げるため、59を足してから60で割ります。たとえば、超過分が61分なら、式はとなり、2時間分として扱います。
計算した超過時間に、会員種別ごとの超過料金EXT-PRICE(M-CODE)を掛け、基本料金B-CHGに加えます。したがって、dには「COMPUTE B-CHG = B-CHG + EXT-PRICE(M-CODE) * EXT-H」が入り、選択肢はウです。
また、作業用ファイルにその会員のレコードがない場合は、行74のCONTINUEで超過料金の計算を行わず、基本料金だけで請求します。これは「利用実績がなかった会員にも、基本料金は請求する」という説明とも一致します。
誤りやすいポイント
-
基本料金と超過料金の並びを混同すること
基本料金は4桁ずつ、超過料金は3桁ずつに分けて読みます。配列の何番目かは会員種別の値に対応しています。 -
利用時間が初めて記録される場合にも加算すること
初めての場合は、まだ加算する相手の合計時間がありません。T-MINをW-MINに設定します。すでにレコードがある場合にだけ加算します。 -
600分以下でも超過料金を計算すること
行76の条件は「W-MIN > 600」です。600分ちょうどなら、超過料金は発生しません。 -
超過分の分数をそのまま料金に掛けること
料金は分単位ではなく、超過時間を時間単位に切り上げて計算します。たとえば、超過分が1分でも1時間分の料金になります。
FAQ
Q: なぜ利用時間を合計してから請求するのですか?
A: 説明では、1か月分の利用時間の合計に応じて請求するとされています。利用記録は1回ごとに保存されるため、作業用ファイルで会員ごとに合計してから請求額を計算します。
A: 説明では、1か月分の利用時間の合計に応じて請求するとされています。利用記録は1回ごとに保存されるため、作業用ファイルで会員ごとに合計してから請求額を計算します。
Q: なぜ超過時間の計算で59を足すのですか?
A: 分を時間単位に切り上げるためです。正の整数の分数を60で割るとき、59を足してから割れば、余りがある場合も次の時間数になります。たとえば、61分ならです。
A: 分を時間単位に切り上げるためです。正の整数の分数を60で割るとき、59を足してから割れば、余りがある場合も次の時間数になります。たとえば、61分ならです。
Q: 利用実績がない会員の請求額はどうなりますか?
A: 利用実績がない場合は作業用ファイルに該当レコードがありません。プログラムは基本料金を先にB-CHGに入れ、該当レコードがない場合は超過料金を加えずに請求レコードを書き込みます。
A: 利用実績がない場合は作業用ファイルに該当レコードがありません。プログラムは基本料金を先にB-CHGに入れ、該当レコードがない場合は超過料金を加えずに請求レコードを書き込みます。
関連キーワード: 索引ファイル、順ファイル、主レコードキー、配列、切り上げ、順呼出し
設問2:
問題文を見る テストデータを用いて動作確認をしたところ、利用記録ファイルのレコード数の増加に伴って、処理時間が想定を大きく超えることが判明した。調査の結果、作業用ファイルの入出力に多くの時間を費やしていた。そこで、整列機能を使用して処理時間の短縮を図ることにし、表2の変更を行うことにした。表2のプログラムでは、図4に示すレコード様式の整列併合用ファイルを作業用ファイルとして使用する。表2のプログラム中のに入れる正しい答えを、解答群の中から選べ。ここで、表2のdには、設問1の正しい答えが入っているものとする。

e, fに関する解答群
ア:ADD W-MIN TO TMP-MIN
イ:MOVE ZERO TO TMP-MIN
ウ:PERFORM WRBILL-PROC
エ:RELEASE W-REC
オ:WRITE W-REC
gに関する解答群
ア:(M-NO = TMP-NO OR TMP-MIN > 600) AND NOT MEM-EOF
イ:M-NO = TMP-NO
ウ:M-NO = TMP-NO AND TMP-MIN > 600
エ:M-NO = TMP-NO OR TMP-MIN > 600
オ:TMP-MIN > 600
模範解答
e:エ、f:ア、g:ウ
解説
解答の導き方
この変更では、利用記録を会員番号順に並べ、その順番に会員ごとの利用時間を合計します。ポイントは、利用記録を整列用ファイルに渡す処理、同じ会員の利用時間を足し合わせる処理、超過料金を適用する条件の3つです。
-
利用記録を整列用ファイルに渡す処理を考えます。「SORT WORK-F ASCENDING KEY W-NO」は、W-NOの順にレコードを並べ替える処理です。整列処理では、入力するレコードをSORTに渡すためにRELEASEを使い、並べ替えたレコードを取り出すときはRETURNを使います。そのため、利用記録から移したW-RECを整列処理に渡すeには、RELEASE W-RECが入ります。選択肢の「WRITE W-REC」は通常のファイルにレコードを書き込む処理であり、SORTへの入力には使いません。
-
同じ会員の利用時間を合計する処理を考えます。整列後のレコードは、会員番号順に取り出されます。したがって、同じ会員番号のレコードは続けて処理されます。TMP-NOは、直前まで集計していた会員番号です。最初はZEROなので、最初のレコードは「初回の会員」として扱われます。「TMP-NO = W-NO OR ZERO」の場合は、現在のレコードの利用時間を、集計中の合計に加えます。同じ会員の利用時間を合計するには、fにはADD W-MIN TO TMP-MINが入ります。別の会員に切り替わったときは、現在の合計を請求に回した後、MOVE W-MIN TO TMP-MINで新しい会員の合計を始めます。
-
超過料金を適用する条件を考えます。利用時間は「分」で記録され、基本料金で利用できるのは10時間までです。10時間を分に直すと、分です。超過料金を計算してよいのは、請求対象の会員と、集計した利用時間の会員が同じで、かつ利用時間が600分を超えている場合です。そのため、条件は「M-NO = TMP-NO」と「TMP-MIN > 600」の両方を満たす必要があります。この条件に合うのは、gの「M-NO = TMP-NO AND TMP-MIN > 600」です。会員番号が一致しなければ、その利用時間を別の会員に適用してしまいます。また、利用時間が600分以下なら、超過料金を計算してはいけません。会員ファイルにある会員は、利用実績がなくても基本料金を請求します。WRBILL-PROCは会員ファイルを順に読み進めて請求し、超過料金の条件を満たした場合だけ追加の計算を行います。
誤りやすいポイント
-
RELEASEとWRITEを混同しないようにします。
RELEASEはSORTにレコードを渡す処理です。通常のファイルにレコードを書き込むWRITEとは役割が異なります。 -
会員番号が変わったときに、利用時間を加算し続けないようにします。
別の会員に切り替わったら、前の会員の合計を請求に回してから、新しい会員のW-MINをTMP-MINに設定します。 -
超過料金の条件をANDで考えます。
会員番号の一致と、600分を超えていることの両方が必要です。どちらか一方だけを条件にすると、誤った会員に超過料金を加算したり、600分以下でも超過料金を加算したりするおそれがあります。
FAQ
Q: 最初の利用記録も、正しく集計できますか?
A: できます。TMP-NOとTMP-MINは最初にZEROなので、初回のレコードは「TMP-NOがZERO」の条件に当てはまり、W-MINがTMP-MINに加算されます。
A: できます。TMP-NOとTMP-MINは最初にZEROなので、初回のレコードは「TMP-NOがZERO」の条件に当てはまり、W-MINがTMP-MINに加算されます。
Q: 利用実績がない会員は、どのように請求されますか?
A: 会員ファイルを読みながら基本料金を設定します。利用実績がない会員には、対応する利用時間がないため、超過料金は加算されません。
A: 会員ファイルを読みながら基本料金を設定します。利用実績がない会員には、対応する利用時間がないため、超過料金は加算されません。
Q: 整列することで、どのように集計しやすくなりますか?
A: 会員番号順にレコードが並ぶため、同じ会員の利用記録が連続します。会員番号を使って作業用ファイルを何度も検索する代わりに、順番に読みながら利用時間を合計できます。
A: 会員番号順にレコードが並ぶため、同じ会員の利用記録が連続します。会員番号を使って作業用ファイルを何度も検索する代わりに、順番に読みながら利用時間を合計できます。
関連キーワード: 整列処理、ソートファイル、順ファイル、順呼出し、グループ集計




