戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2014年 秋期 午後 問10


次のCOBOLプログラムの説明及びプログラムを読んで、設問1,2に答えよ。

〔プログラムの説明〕  X社では、特定の商品の売上傾向を分析するために、2年分の売上についてグラフ化することにした。このプログラムは、分析する商品の商品コードをパラメタで受け取り、全ての商品の売上データが記録されている売上ファイルから当該商品の売上を月ごとに集計して、結果を図1に示すように印字する。
基本情報技術者試験(平成26年 午後 問10 図1) ↩設問2
(1) 売上グラフは、2012年4月〜2014年3月の各月の売上を表す。  ① 縦軸の数値は売上金額(単位は万円)で、下段から、1〜100,000円、100,001〜200,000円、…、900,001〜1,000,000円を表す。  ② 横軸の数値は月で、左端から、2012年4月、2012年5月、…、2014年3月を表す。  ③ 縦軸と横軸の数値は、用紙にあらかじめ印字されている。
(2) 売上ファイルは、図2に示すレコード様式の順ファイルで、X社が扱う全ての商品の2012年4月〜2014年3月の各営業日の売上データが格納されている。レコードは売上日の昇順に整列されている。
基本情報技術者試験(平成26年 午後 問10 図2)  ① 売上日には、年、月、日が、それぞれ4桁、2桁、2桁の西暦で格納されている。  ② 商品コードには、販売した商品のコードが格納されている。商品コードは、商品ごとに一意に割り当てられている。  ③ 取引先コードには、商品を販売した取引先のコードが格納されている。取引先コードは、取引先ごとに一意に割り当てられている。  ④ 各商品の月ごとの売上金額は、1~999,999円とする。
基本情報技術者試験(平成26年 午後 問10 プログラム)

設問1:

問題文を見る
 プログラム中のに入れる正しい答えを、解答群の中から選べ。   a, bに関する解答群  ア:ADD 1 TO CR-MONTH  イ:ADD S-AMOUNT TO AMOUNT-MONTH(IX-COL)  ウ:MOVE 1 TO CR-MONTH  エ:MOVE S-AMOUNT TO AMOUNT-MONTH(CR-MONTH)  オ:MOVE S-MM TO CR-MONTH  カ:MOVE S-MM TO IX-LINE IX-COL   cに関する解答群  ア:PRINT-ELM(IX-COL, IX-LINE)  イ:PRINT-ELM(IX-LINE, IX-COL)  ウ:PRINT-MK(IX-COL, IX-LINE)  エ:PRINT-MK(IX-LINE, IX-COL)

模範解答

a:オ、b:イ、c:エ

解説

解答の導き方

まず、このプログラムは、指定された商品の売上を月ごとに合計し、その結果をグラフに印字します。売上ファイルは売上日の昇順なので、対象商品のレコードを読み進めると、月も順番に移っていきます。
aとb:月が変わったときの処理と売上の加算
AMOUNT-DATA は、月ごとの合計を入れる領域です。OCCURS 24 は、同じ形の値を24個分用意する指定です。配列(値を番号付きで並べて扱う仕組み)のように、AMOUNT-MONTH(1) から AMOUNT-MONTH(24) までで、2012年4月から2014年3月までの各月を表します。
プログラムの開始時に、CR-MONTH は4、IX-COL は1に設定されています。つまり、最初は2012年4月を処理する状態です。売上レコードの S-MM が CR-MONTH と違うとき、次の月に進んだと判断します。そのため、aでは、現在の売上レコードが示す月を CR-MONTH に記録する必要があります。
たとえば、2012年12月から2013年1月に移ると、S-MM は12から01になります。ここで単純に CR-MONTH に1を加えると、13になってしまいます。実際の月番号と一致しなくなるため、S-MM の値をそのまま CR-MONTH に移す オ が適切です。
月が変わった後は、IX-COL を1増やして、次の月の位置に進みます。
処理する月月が変わった後のCR-MONTHIX-COL
開始時の2012年4月041
2012年5月052
2012年12月129
2013年1月0110
次に、対象商品の売上金額を、その月の合計に加えます。INITIALIZE AMOUNT-DATA によって月ごとの合計は0から始まります。同じ月に複数の売上レコードがあれば、金額を上書きせずに合計しなければなりません。そのため、bには S-AMOUNT を AMOUNT-MONTH(IX-COL) に加算する イ が入ります。
c:グラフ内の位置を決める
売上ファイルの説明には「各商品の月ごとの売上金額は、1~999,999円」とあります。グラフの縦方向は、売上金額を100,000円ごとの段に分けて表します。プログラムの計算式は、金額をその段の番号に変換しています。
たとえば、100,001円の場合は次の計算になります。
したがって、100,001円は2段目になります。1~100,000円は1段目、100,001~200,000円は2段目に対応します。この段の番号が IX-LINE です。一方、IX-COL は何月目かを表します。
印字用の表では、PRINT-LINE OCCURS 10 が縦方向の段を表し、その内側の PRINT-ELM OCCURS 24 が月の位置を表します。つまり、PRINT-MK を指定するときの添字(配列の何番目かを示す番号)は、外側の段、内側の月の順になります。したがって、段に IX-LINE、月に IX-COL を使う PRINT-MK(IX-LINE, IX-COL) が正しく、cは エ です。
また、PRINT-MK は2文字分の項目です。ここに「*」をすべて入れると「**」となり、グラフ上の印になります。月ごとの位置の間隔を作る1文字分の項目はそのまま残るため、PRINT-ELM 全体ではなく PRINT-MK を指定します。

誤りやすいポイント

  • 月が変わったとき、CR-MONTH に1を加えると考えないようにします。12月から1月に移る場合、1を加えると13になり、月番号と一致しません。
  • bで売上金額を移すだけにすると、同じ月に複数の売上がある場合、前の金額が上書きされます。月ごとの合計なので、加算します。
  • cでは、縦の段と横の月の順番を取り違えないようにします。表の外側が段、内側が月です。
  • 印字する範囲は PRINT-ELM 全体ではなく、記号を入れる2文字分の PRINT-MK です。

FAQ

Q: CR-MONTH に年を持たせなくても、2年分の月を区別できますか?
A: 年を含む月の位置は IX-COL が表します。売上日が昇順なので、月の切り替わりを検出するための CR-MONTH には、月番号だけを持たせています。
Q: なぜ IX-COL は1から始まるのですか?
A: グラフの最初の月が2012年4月だからです。2012年4月の合計を1番目に入れ、月が変わるたびに1を加えて次の位置へ進みます。

関連キーワード: 順ファイル、集計処理、配列、添字、端数切上げ

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

 図1に示すグラフでは、季節変動がある商品の中長期的な傾向の分析は難しいことが分かった。そこで、図3に示すZチャートを表示するようにプログラムを変更することにした。表1中のに入れる正しい答えを、解答群の中から選べ。ここで、表1中のcには設問1の正しい答えが入っているものとする。
基本情報技術者試験(平成26年 午後 問10 図3)   〔Zチャートの説明〕  ある月を起点に、各月の売上、起点からの売上累計、その月を含む過去1年間の売上合計を表すグラフである。これら三つのグラフを重ね合わせるとZの形になることからZチャートと呼ばれ、季節変動のある商品の売上傾向を分析する際などに用いられる。   〔図3の説明〕  (1) 縦軸の数値は売上金額(単位は万円)で、下段から、1~500,000円、500,001~1,000,000円、…、11,500,001~12,000,000円を表す。  (2) 横軸の数値は月で、左端から、2013年4月、2013年5月、…、2014年3月を表す。  (3) 2013年4月を起点として、各月の売上、起点からの売上累計、その月を含む過去1年間の売上合計を、それぞれ記号"*"、"@"、"#"で印字する。ここで、印字が重なる場合は、優先順位("#" > "@" > "*")の高い方を印字する。  (4) 縦軸と横軸の数値は、用紙にあらかじめ印字されている。
基本情報技術者試験(平成26年 午後 問10 表1)
d〜fに関する解答群  ア:ADD AMOUNT-MONTH(IX-AMOUNT) TO Z-TOTAL  イ:ADD AMOUNT-MONTH(IX-AMOUNT) TO Z-YEAR  ウ:ADD Z-TOTAL TO Z-YEAR  エ:COMPUTE Z-YEAR = Z-YEAR + AMOUNT-MONTH(IX-AMOUNT) - AMOUNT-MONTH(IX-AMOUNT - 12)  オ:COMPUTE Z-YEAR = Z-YEAR + Z-TOTAL + AMOUNT-MONTH(IX-COL - 1)  カ:MOVE AMOUNT-MONTH(IX-COL) TO Z-TOTAL

模範解答

d:イ、e:ア、f:エ

解説

解答の導き方

このプログラムでは、月ごとの売上を使って、図3のZチャートに必要な三つの値を求めます。
  • その月の売上
  • 起点からの売上累計
  • その月を含む過去1年間の売上合計
まず、配列AMOUNT-MONTHの番号と月の対応を確認します。売上は2012年4月から2014年3月までの24か月分なので、AMOUNT-MONTH(1)が2012年4月、AMOUNT-MONTH(12)が2013年3月、AMOUNT-MONTH(13)が2013年4月、AMOUNT-MONTH(24)が2014年3月に当たります。
1. dは、最初の12か月分をZ-YEARに加えます。
表1の最初のループは、IX-AMOUNTを1から12まで動かします。この範囲は2012年4月から2013年3月までです。
図3では2013年4月からのグラフを描きますが、最初の月の「その月を含む過去1年間の売上合計」を出すには、その前の12か月分が必要です。そこで、最初のループで2012年4月から2013年3月までの売上をZ-YEARに合計します。
したがって、dには「ADD AMOUNT-MONTH(IX-AMOUNT) TO Z-YEAR」を入れます。解答群ではイです。
2. 二つ目のループでは、2013年4月からの12か月を順に処理します。
最初のループが終わると、IX-AMOUNTは13になります。二つ目のループではIX-COLが1から12まで動き、IX-AMOUNTは各回の最後に1ずつ増えます。そのため、IX-COLは図の列、IX-AMOUNTは売上データの月を表し、次のように対応します。
IX-COLIX-AMOUNT月
1132013年4月
2142013年5月
………
12242014年3月
3. eは、起点からの売上累計を更新します。
Z-TOTALは、2013年4月を起点とする売上累計です。最初にZ-TOTALを0にしておき、処理中の月の売上を毎回加えれば、起点からその月までの累計になります。
たとえば、2013年4月の処理では、AMOUNT-MONTH(13)の売上をZ-TOTALに加えます。2013年5月の処理では、さらにAMOUNT-MONTH(14)の売上を加えます。
したがって、eには「ADD AMOUNT-MONTH(IX-AMOUNT) TO Z-TOTAL」を入れます。解答群ではアです。
4. fは、過去1年間の売上合計を更新します。
Z-YEARには、最初のループで2012年4月から2013年3月までの合計を用意しました。2013年4月の過去1年間の合計にするには、そこへ2013年4月の売上を加え、1年前の2012年4月の売上を差し引きます。
つまり、合計を更新するたびに、
  • 処理中の月の売上を加える
  • その月の12か月前の売上を差し引く
という処理をします。たとえば、IX-AMOUNTが13なら、AMOUNT-MONTH(13)を加え、AMOUNT-MONTH(13 - 12)、つまりAMOUNT-MONTH(1)を差し引きます。これにより、合計の対象は2012年5月から2013年4月までの12か月になります。
この処理に当たるのは「COMPUTE Z-YEAR = Z-YEAR + AMOUNT-MONTH(IX-AMOUNT) - AMOUNT-MONTH(IX-AMOUNT - 12)」です。解答群ではエです。
5. 印字する段の計算も、三つの値の違いを確認します。
各値は、500,000円ごとの段に変換されます。計算式の「売上金額 + 499999」を500000で割ることで、500,000円単位の段に切り上げます。たとえば、500,001円は2段目に入ります。
また、同じ列・同じ段に複数の記号が重なる場合は、印字の順序が大切です。プログラムは「」、次に「@」、最後に「#」を印字するため、後から印字する記号が先の記号を上書きします。この順序で、指定された優先順位(「#」 > 「@」 > 「」)を実現できます。

誤りやすいポイント

  • Z-TOTALとZ-YEARの役割を混同すること
    Z-TOTALは起点からの累計です。一方、Z-YEARはその月を含む過去1年間の合計です。
  • 最初の12か月を合計する理由を見落とすこと
    グラフの開始月である2013年4月の過去1年間を求めるには、その前の12か月分を先に用意しておく必要があります。
  • IX-COLとIX-AMOUNTを同じものと考えること
    IX-COLはグラフの列番号で1から12まで動きます。IX-AMOUNTは売上データの月を指し、13から24まで動きます。
  • 1年前の売上を差し引く処理を忘れること
    現在の売上を加えるだけでは、過去1年間より古い月の売上が合計に残ります。12か月前の売上を差し引くことで、対象期間を1か月ずつ移動できます。

FAQ

Q: 最初のループでZ-TOTALではなくZ-YEARに加えるのはなぜですか?
A: 最初のループで合計するのは、グラフの起点より前の12か月分だからです。起点からの累計であるZ-TOTALには含めず、過去1年間の合計を準備するZ-YEARに加えます。
Q: なぜIX-AMOUNTから12を引いた番号の売上を差し引くのですか?
A: その月の12か月前の売上を除くためです。現在の月を加えて12か月前の月を除くことで、過去1年間の合計を保てます。
Q: 記号の印字順序は、なぜ「*」、「@」、「#」なのですか?
A: 同じ位置に印字が重なったとき、後から印字された記号が前の記号を上書きするためです。「#」を最後に印字すれば、「#」が最も優先されます。

関連キーワード: Zチャート、累計、移動合計、配列、整数除算

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

戦国ITクイズ機能

\ せっかくなら /

基本情報技術者を
クイズ形式で学習しませんか?

クイズ画面へ遷移する→

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について