基本情報技術者 2009年 秋期 午後 問10
次のCOBOLプログラムの説明及びプログラムを読んで、設問1,2に答えよ。
〔プログラムの説明〕
売上伝票ファイルに記録された各支店(A~E)の月単位の売上情報を支店ごとに集計して、売上マスタファイルに格納する月次処理のプログラムである。なお、集計した当該月の売上データは画面にも表示する。
(1) 売上伝票ファイルは、図1に示すレコード様式の順ファイルである。

① 売上伝票ファイルには、ある月の1か月分の売上データを格納する。
② 伝票番号には、6けたの数字を格納する。
③ 売上日には、西暦年を4けた、月、日をそれぞれ2けたの数字で格納する。なお、一つのファイルに含まれるレコードの西暦年と月は、それぞれすべて等しい。
④ 支店コードは、A~Eの支店に対して昇順に割り当てた1~5の数字である。
(2) 売上マスタファイルは、図2に示すレコード様式の、売上年月を主キーとする索引ファイルである。

① 売上年月には、西暦年が4けた、月が2けたの数字を格納する。
② 売上金額には、当該月の各支店の売上金額を格納する。
③ 売上合計金額には、当該月の全支店の売上金額の合計を格納する。
④ 各支店の1か月分の売上金額は、8けたを超えないものとする。
(3) 集計結果の表示例を図3に示す。

① 当該月の支店別売上金額を降順に整列して表示する。
② TOTALには、売上合計金額を表示する。

設問1:
問題文を見る プログラム中のに入れる正しい答えを、解答群の中から選べ。
a, b, dに関する解答群
ア:ADD MAST-AMOUNT(CNT) TO MAST-TOTAL
イ:ADD SALES-AMOUNT TO MAST-TOTAL
ウ:ADD SALES-AMOUNT TO SORT-AMOUNT
エ:MOVE MAST-AMOUNT(CNT) TO SORT-AMOUNT
オ:MOVE SALES-AMOUNT TO SORT-AMOUNT
カ:MOVE SALES-BR TO SORT-BR
キ:MOVE SALES-YYYYMM TO MAST-YYYYMM
cに関する解答群
ア:ASCENDING KEY SORT-AMOUNT
イ:ASCENDING KEY SORT-BR
ウ:DESCENDING KEY SORT-AMOUNT
エ:DESCENDING KEY SORT-BR
模範解答
a:キ、b:ア、c:ウ、d:エ
解説
解答の導き方
この問題では、売上伝票ファイルの明細を支店ごとに合計し、その合計を売上マスタファイルに保存します。さらに、支店別の合計を金額の大きい順に表示します。
COBOL(Common Business-Oriented Language:事務処理向けのプログラミング言語)では、SORT-FILEのような作業用ファイルを使って、データを並べ替えることができます。
1. 最初の伝票から売上年月を設定します
売上伝票ファイルの売上日は、プログラムではSALES-YYYYMMとSALES-DDに分けて扱っています。売上マスタファイルのキーは売上年月なので、売上日から年と月の部分を取り出して、マスタ側の項目に設定する必要があります。
また、問題文には「一つのファイルに含まれるレコードの西暦年と月は、それぞれすべて等しい」とあります。そのため、最初の伝票から売上年月を設定すれば、ファイル内の全伝票に共通する年月を登録できます。
したがって、aにはSALES-YYYYMMをMAST-YYYYMMへ移す処理が入ります。
2. 支店ごとの売上金額を合計します
MAST-AMOUNT(CNT)は、支店ごとの金額を入れる配列(同じ種類のデータを番号で区別して並べた領域)です。支店コードは1~5なので、たとえば支店コードが3なら、3番目のMAST-AMOUNTにその支店の金額を入れます。
最初の伝票については、43行目で該当する支店のMAST-AMOUNTに金額を設定します。その後の伝票は、48行目で該当する支店の金額に加算します。こうして、支店ごとの月間売上金額が集まります。
続く51~53行目では、CNTを1から5まで変えながら、各支店の合計をMAST-TOTALに加算します。つまり、bには「各支店の合計を全支店の合計に加える処理」が入ります。解答群では、MAST-AMOUNT(CNT)をMAST-TOTALに加える選択肢です。
3. 支店別の合計金額を並べ替えるデータを作ります
表示処理では、65~69行目で支店ごとに1件ずつSORT-FILEへ渡します。66行目でSORT-BRにCNTを設定しているため、そのレコードがどの支店のものかはSORT-BRで分かります。
並べ替える対象は、伝票1件ごとの売上金額ではなく、すでに集計済みの支店別売上金額です。そのため、dにはMAST-AMOUNT(CNT)をSORT-AMOUNTへ移す処理が入ります。
4. 金額の大きい順に並べ替えます
問題文では、支店別売上金額を「降順に整列して表示する」とあります。降順は、大きい値から小さい値へ並べる順番です。
SORTのキーにSORT-AMOUNTを指定し、DESCENDING(降順)で並べ替えれば、金額の大きい支店から表示できます。したがって、cはSORT-AMOUNTを降順にする選択肢です。
図3でも、C-BRANCHの32,100,000が先頭に表示され、その後に23,000,000、18,700,000と続いています。支店コード順ではなく、売上金額順に並んでいることが分かります。SORT-BRは並べ替え後に支店名を表示するために使われます。
誤りやすいポイント
- aは売上金額ではなく、売上年月を設定する箇所です。売上金額は直後の43行目でMAST-AMOUNTに設定されます。
- bで合計するのは、個々の伝票の売上金額ではなく、支店ごとに集計済みのMAST-AMOUNTです。
- dに伝票のSALES-AMOUNTを使うと、伝票単位のデータを並べ替えることになります。この処理で並べ替えるのは、支店ごとの月間合計です。
- cを支店コード順にすると、支店別の金額が大きい順になりません。表示順の条件は「降順」なので、SORT-AMOUNTが並べ替えの基準です。
FAQ
Q: 最初の伝票だけ、後続の伝票と処理が違うのはなぜですか?
A: 最初の伝票では、年月をマスタに設定する必要があります。また、各支店の合計額を最初に入れます。2件目以降は、すでに入っている支店別金額に加算します。
A: 最初の伝票では、年月をマスタに設定する必要があります。また、各支店の合計額を最初に入れます。2件目以降は、すでに入っている支店別金額に加算します。
Q: SORT-BRをSORTのキーにしないのはなぜですか?
A: SORT-BRは、並べ替え後にどの支店名を表示するかを判別するために使います。表示順は売上金額で決まるため、並べ替えのキーはSORT-AMOUNTです。
A: SORT-BRは、並べ替え後にどの支店名を表示するかを判別するために使います。表示順は売上金額で決まるため、並べ替えのキーはSORT-AMOUNTです。
Q: MAST-TOTALは、どのタイミングで表示されますか?
A: 支店ごとの並べ替え結果を表示した後、79~80行目でMAST-TOTALを表示します。支店別金額の一覧とは別に、全支店の合計を表示する処理です。
A: 支店ごとの並べ替え結果を表示した後、79~80行目でMAST-TOTALを表示します。支店別金額の一覧とは別に、全支店の合計を表示する処理です。
関連キーワード: 順ファイル、索引ファイル、配列、集計処理、降順整列
設問2:
問題文を見る 各支店の当該月の売上金額に加えて対前年同月比を表示するようにプログラムを変更する。このとき、前年同月の売上金額がゼロであるか又は情報の取得に失敗した場合は、“( - %)”と表示する。集計結果の表示例を、図4に示す。次の表中のに入れる正しい答えを、解答群の中から選べ。
なお、対前年同月比は、999%を超えないものとする。


eに関する解答群
ア:MOVE MAST-AMOUNT(CNT) TO THIS-TOTAL
イ:MOVE MAST-REC TO W-MAST
ウ:MOVE MAST-TOTAL TO THIS-TOTAL
エ:MOVE W-MAST TO MAST-REC
f, gに関する解答群
ア:COMPUTE RATIO = MAST-AMOUNT(SORT-BR) * 100 / SORT-AMOUNT
イ:COMPUTE RATIO = MAST-TOTAL * 100 / THIS-TOTAL
ウ:COMPUTE RATIO = SORT-AMOUNT * 100 / MAST-AMOUNT(SORT-BR)
エ:COMPUTE RATIO = SORT-AMOUNT * 100 / MAST-TOTAL
オ:COMPUTE RATIO = THIS-TOTAL * 100 / MAST-TOTAL
模範解答
e:ウ、f:ウ、g:オ
解説
解答の導き方
この変更で表示するのは、当該月の売上金額に加えた「対前年同月比」です。対前年同月比は、当該月の金額を前年同月の金額で割り、を掛けて求めます。
まず、変更後の処理で、当該月と前年同月のどちらの金額を使うのかを整理します。
-
当該月の売上金額は、SORT-FILEに残っています。
プログラムは、支店ごとの当該月の売上金額をSORT-FILEに入れてから、表示のために並べ替えます。SORT-BRは支店を表し、SORT-AMOUNTはその支店の当該月の売上金額です。 -
前年同月の売上金額は、売上マスタファイルから読み込みます。
売上マスタファイルの主キー(レコードを特定する項目)は売上年月です。現在の売上年月からを引くと、月を変えずに年だけを1年前にできます。その年月をキーにして前年同月のレコードを読み込み、W-MASTに格納します。読み込みに失敗した場合はW-MASTを初期化するため、前年同月の金額はゼロになります。 -
前年のレコードを読み込む前に、当該月の合計を退避します。
前年同月のレコードをW-MASTに読み込むと、W-MASTに入っていた当該月の合計は上書きされます。そのため、読み込み前に当該月の合計であるMAST-TOTALをTHIS-TOTALに保存します。よって、eには「MOVE MAST-TOTAL TO THIS-TOTAL」が入ります。解答群ではウです。 -
支店ごとの比率は、当該月の支店別金額を前年同月の同じ支店の金額で割ります。
当該月の支店別金額はSORT-AMOUNT、前年同月の同じ支店の金額はMAST-AMOUNT(SORT-BR)です。したがって、計算式は次のとおりです。fには「COMPUTE RATIO = SORT-AMOUNT * 100 / MAST-AMOUNT(SORT-BR)」が入ります。解答群ではウです。前年同月の同じ支店の金額がゼロの場合は計算せず、「( - %)」を表示します。 -
合計の比率も、当該月と前年同月の合計同士で計算します。
当該月の合計は退避したTHIS-TOTAL、前年同月の合計はMAST-TOTALです。したがって、計算式は次のとおりです。gには「COMPUTE RATIO = THIS-TOTAL * 100 / MAST-TOTAL」が入ります。解答群ではオです。前年同月の合計がゼロの場合も、比率を計算せず「( - %)」を表示します。
誤りやすいポイント
- 比率は「前年同月を当該月で割る」のではなく、「当該月を前年同月で割る」計算です。分母と分子を逆にすると、対前年同月比になりません。
- 支店ごとの比率では、前年同月の合計ではなく、前年同月の同じ支店の金額を使います。SORT-BRを使うことで、対応する支店の金額を参照できます。
- 合計の比率では、支店別の金額ではなく、合計同士を使います。当該月の合計は、前年のレコードを読み込む前にTHIS-TOTALへ保存しておく必要があります。
- 前年同月のデータを読み込めなかった場合だけでなく、前年同月の売上金額がゼロの場合も、ゼロ除算を避けるため比率を計算しません。
FAQ
Q: なぜ前年同月のデータを読み込む前に、当該月の合計を保存するのですか?
A: 前年同月のレコードをW-MASTへ読み込むと、W-MASTに入っていた当該月の合計が前年の合計で上書きされるためです。当該月の合計をTHIS-TOTALに保存すれば、あとで前年同月の合計と比較できます。
A: 前年同月のレコードをW-MASTへ読み込むと、W-MASTに入っていた当該月の合計が前年の合計で上書きされるためです。当該月の合計をTHIS-TOTALに保存すれば、あとで前年同月の合計と比較できます。
Q: 前年同月のレコードがない場合、支店別の比率はどうなりますか?
A: W-MASTが初期化され、前年同月の支店別金額はゼロになります。そのため、比率の計算は行わず「( - %)」を表示します。
A: W-MASTが初期化され、前年同月の支店別金額はゼロになります。そのため、比率の計算は行わず「( - %)」を表示します。
Q: 支店別の比率と合計の比率で、式の分母が違うのはなぜですか?
A: 支店別の比率は、その支店の前年同月の金額との比較です。合計の比率は、全支店の前年同月の合計との比較です。比べる対象に合わせて分母を選びます。
A: 支店別の比率は、その支店の前年同月の金額との比較です。合計の比率は、全支店の前年同月の合計との比較です。比べる対象に合わせて分母を選びます。
関連キーワード: COBOL、索引ファイル、主キー、配列、ソート、対前年同月比



