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

基本情報技術者 2012年 春期 午後 問10


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

〔プログラムの説明〕  ある遊園地では、ICカードを利用した精算システムを導入した。入園時に、入園者から入園料を受け取ると、入園者番号を記録したICカードを渡し、入園者番号と年齢層の情報を入園者ファイルに格納する。各施設では、提示されたICカードから入園者番号を読み取り、施設利用実績をイベントファイルに格納する。退園時に、入園者からICカードが返却されたときに、施設利用料金を一括で徴収する。  このプログラムは、入園者ファイル及びイベントファイルに格納されたデータを読み込み、入園者に関する情報を集計して表示する。   (1) 入園者ファイルは、図1に示すレコード様式の、入園者番号を主キーとする索引ファイルである。ファイルは、営業日ごとに作成する。
基本情報技術者試験(平成24年 午後 問10 図1)
 ① 入園者番号は、営業日ごとに一意となる、1から始まる4桁の数字である。  ② 年齢層コードには、4〜12歳は1、13〜18歳は2、19〜29歳は3、30〜49歳は4、50歳以上は5を格納する。4歳未満は入園料及び遊戯施設利用料金が無料となるので、ICカードは発行せず、入園者ファイルにも格納しない。 (2) イベントファイルは、図2に示すレコード様式の順ファイルである。入園者のICカード利用状況(以下、イベントという)を格納する。ファイルは、営業日ごとに作成する。
基本情報技術者試験(平成24年 午後 問10 図2)
 ① イベントコードには、発生したイベントに応じて、表1に示すイベントコードを格納する。
基本情報技術者試験(平成24年 午後 問10 表1)
 ② 時刻には、イベントが発生した時刻の時、分、秒を24時間表記で格納する。時系列で格納するので、レコードは時刻の昇順になっている。   なお、この遊園地は10時に開園し、全ての入園者は20時になるまでに退園する。20時台の時刻が格納されることはない。  ③ 金額には、該当するイベントを利用した際の金額を格納する。   なお、入退園(イベントコード01、02)の場合は、0を格納する。  ④ 一旦退園した入園者が、その日のうちに同じ入園者番号で再入園することはない。
(3) 集計結果の表示例を図3に示す。
基本情報技術者試験(平成24年 午後 問10 図3)
 ① TOTAL GUESTSには、入園者数を表示する。1日の入園者数が5,000人を超えることはない。  ② STAY GUESTSには、左端に表示した時間帯の滞在者数を、年齢層別に棒グラフで表示する。例えば、10時ちょうどに入園し、11時ちょうどに退園した者は、10時台と11時台の滞在者として数える。  ③ 棒グラフを構成する各記号は、表2に示すとおり滞在者の年齢層と対応している。記号一つは100人を表し、100人未満の端数は切り捨てる。
基本情報技術者試験(平成24年 午後 問10 表2)
基本情報技術者試験(平成24年 午後 問10 プログラム)

設問1:

問題文を見る
 プログラム中のに入れる正しい答えを、解答群の中から選べ。   aに関する解答群  ア:MOVE STAY-CNT(CR-HH) TO PRT-AGE(CR-HH - 8, E-HH)  イ:MOVE STAY-CNT(CR-HH - 8) TO PRT-TIME(CR-HH)  ウ:MOVE STAY-GUEST TO PRT-TIME(CR-HH - 8)  エ:MOVE ZERO TO PRT-AGE(CR-HH - 8, CR-HH)   b〜dに関する解答群  ア:CR-HH  イ:I  ウ:J  エ:PRT-AGE(CR-HH - 9, G-AGE)  オ:PRT-AGE(G-AGE, CR-HH - 9)  カ:STAY-CNT(CR-HH)  キ:STAY-CNT(G-AGE)  ク:TOTAL-GUEST   eに関する解答群  ア:ADD J TO MARK-CNT  イ:ADD J TO MARK-POS  ウ:ADD MARK-CNT TO MARK-POS  エ:ADD MARK-POS TO MARK-CNT

模範解答

a:ウ、b:エ、c:キ、d:ク、e:ウ(b,c,dは順不同)

解説

解答の導き方

イベントファイルを時刻順に読みながら、時間帯ごとの滞在者数と年齢層別の人数を記録します。ここでいう配列とは、同じ種類のデータを複数まとめて扱う仕組みです。配列の何番目を使うかを表す数値を添字といいます。
a:時間帯ごとの滞在者数を記録する処理
時間帯別・年齢層別の人数は、PRT-AGEに記録します。PRT-AGEの1番目の添字が時間帯、2番目の添字が年齢層です。10時台が1番目、11時台が2番目です。
イベントを読み込んだとき、イベントの時刻E-HHが現在の時刻CR-HHと異なれば、時間帯が切り替わっています。プログラムは、イベントを処理する前に、現在の滞在者数STAY-GUESTを次の時間帯の記録欄へ移します。
ループ内のCR-HHは、記録する時間帯の一つ前の時刻です。たとえば、CR-HHが10のとき、次に記録するのは11時台です。時間帯の欄番号は時刻から9を引いて求めるので、次の時間帯の欄番号は、(CR-HH + 1)- 9、つまりCR-HH - 8です。
そのため、STAY-GUEST全体をPRT-TIME(CR-HH - 8)へ移す選択肢ウが当てはまります。ここで、PRT-TIMEの各欄には、5年齢層分の人数が入っています。
b〜d:入園イベントの処理
SUM-PROCでは、イベントの入園者番号を使って入園者ファイルを読み込みます。年齢層コードはG-AGEに入ります。入園イベントでは、次の3か所をそれぞれ1増やします。
  • 現在の時間帯・年齢層の人数:PRT-AGE(CR-HH - 9, G-AGE)
  • 現在園内にいる、その年齢層の人数:STAY-CNT(G-AGE)
  • その日の入園者数:TOTAL-GUEST
時間帯別の欄番号は、現在時刻CR-HHから9を引いて求めます。たとえば、10時台なら10 - 9 = 1なので、1番目の欄です。年齢層別の欄番号には、入園者の年齢層コードG-AGEを使います。
したがって、bにはPRT-AGE(CR-HH - 9, G-AGE)、cにはSTAY-CNT(G-AGE)、dにはTOTAL-GUESTが入ります。解答群では、順にエ、キ、クです。
退園イベントでは、STAY-CNT(G-AGE)を1減らします。退園しても、その日に入園した人数を表すTOTAL-GUESTは減らしません。
e:棒グラフの記号を並べる処理
PRT-AGE(I, J)には、時間帯I・年齢層Jの人数が入っています。記号一つは100人を表し、100人未満は切り捨てるので、人数を100で割った値がMARK-CNTになります。たとえば、250人ならMARK-CNTは2です。
記号を書き込む位置を表すMARK-POSは、各時間帯の表示を始めるときに1に初期化されています。MARK(J)(1:MARK-CNT)から記号をMARK-CNT個取り出して表示行へ書いた後、次の年齢層の記号をその後ろに続けて書けるよう、位置をMARK-CNT分だけ進めます。
その処理はADD MARK-CNT TO MARK-POSです。よって、eには選択肢ウが当てはまります。

誤りやすいポイント

  • STAY-CNTは、現在園内にいる人数を年齢層別に記録します。PRT-AGEは、表示する時間帯ごとの人数を年齢層別に記録します。役割を混同しないようにします。
  • 現在時刻に対応する時間帯の欄番号はCR-HH - 9です。一方、次の時間帯へ滞在者数を移すときは、次の時間帯の欄を指定するためCR-HH - 8になります。
  • 退園時に減らすのは現在の滞在者数です。1日の入園者数TOTAL-GUESTは減らしません。
  • MARK-POSは次に記号を書き始める位置です。年齢層が一つ進むたびに1進めるのではなく、実際に書いた記号の個数MARK-CNTだけ進めます。

FAQ

Q: 10時ちょうどに入園し、11時ちょうどに退園した人は、なぜ11時台の滞在者にも数えられるのですか?
A: 時刻が11時に切り替わると、退園イベントを処理する前に、その時点の滞在者数を11時台の記録欄へ移すためです。その後で退園処理を行うので、11時ちょうどに退園する人も11時台の滞在者として記録されます。
Q: 人数が100人未満の場合、棒グラフにはどう表示されますか?
A: 記号一つが100人を表すため、100人未満の部分は記号になりません。たとえば、250人なら記号は2個です。
Q: 退園時にTOTAL-GUESTを減らさないのはなぜですか?
A: TOTAL-GUESTは、その日に入園した人数を表すからです。退園しても、その人がその日に入園した事実は変わりません。

関連キーワード: COBOL、配列、添字、ファイル処理、時系列処理

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

この設問をAIに質問する

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

 各遊戯施設の延べ利用者数を集計し、図4に示すグラフを追加表示するようにプログラムを変更した。表3中のに入れる正しい答えを、解答群の中から選べ。   〔グラフの説明〕 (1) 左端に表示したイベントコードに対応する遊戯施設を利用した延べ人数を表示する。記号#一つは100人を表し、100人未満の端数は切り捨てる。一つの遊戯施設の延べ利用者数が5,000人を超えることはない。 (2) 延べ利用者数が100人未満の遊戯施設の行は表示しない。
基本情報技術者試験(平成24年 午後 問10 図4)
基本情報技術者試験(平成24年 午後 問10 表3)
fに関する解答群  ア:ADD 1 TO FAC-CNT(E-CODE)  イ:ADD 1 TO FAC-CNT(E-CODE - 2)  ウ:ADD G-AGE TO FAC-CNT(E-CODE)  エ:ADD G-NO TO FAC-CNT(E-CODE)  オ:ADD STAY-CNT(G-AGE) TO FAC-CNT(E-CODE)   gに関する解答群  ア:6 TIMES  イ:UNTIL FAC-NO > 6 AND MARK-CNT > 50  ウ:UNTIL FAC-NO > 6 OR MARK-CNT > 50  エ:VARYING FAC-NO FROM 1 BY 1 UNTIL FAC-NO > 6  オ:VARYING FAC-NO FROM 3 BY 1 UNTIL FAC-NO > 8

模範解答

f:イ、g:オ

解説

解答の導き方

この設問では、遊戯施設ごとの延べ利用者数を数える処理と、その数を図4に表示するための繰返し処理を考えます。COBOL(Common Business-Oriented Language:事務処理向けのプログラミング言語)のプログラムでは、処理のまとまりを「段落」や「PERFORM」などで実行します。
1. fでは、遊戯施設の利用を1回ずつ数えます
プログラムのE-FACは、イベントコードが3から8までの場合に成立する条件名です。表1では、イベントコード03から08が遊戯施設の利用を表しています。つまり、WHEN E-FACの処理に来るのは、遊戯施設が利用されたイベントです。
表3で追加するFAC-CNTは、FAC-CNT PIC 9(4) OCCURS 6と定義されています。これは、遊戯施設ごとの件数を6個分記録する配列(同じ形式の値を複数並べて扱う仕組み)です。配列の何番目かを示す番号を添字といいます。
イベントコードは03から08ですが、配列の添字は1から6です。そのため、イベントコードから2を引いて、次のように対応させます。
イベントコードFAC-CNTの添字
031
042
053
064
075
086
したがって、イベントコードに対応する配列の要素はFAC-CNT(E-CODE - 2)です。
また、設問では「延べ人数」を数えます。施設の利用イベントが1件発生するたびに、利用回数を1増やせばよいので、処理はADD 1 TO FAC-CNT(E-CODE - 2)となります。年齢や入園者番号を加えるのではなく、利用イベント1件につき1を加える点が大切です。
2. gでは、イベントコード03から08までを順番に表示します
図4では、左端に遊戯施設を表すイベントコードを表示します。表3の出力処理では、FAC-NOが表示するイベントコードであり、FAC-CNT(FAC-NO - 2)でその施設の利用数を取り出します。
FAC-NOを03から08まで1ずつ増やせば、6施設すべてを順番に確認できます。COBOLの繰返し処理では、UNTILの条件が成立するまで処理を続けます。FAC-NOを3から始め、FAC-NO > 8になるまで繰り返すと、FAC-NOは03、04、05、06、07、08の順に変わります。FAC-NOが09になると条件が成立し、繰返しが終わります。
このため、gには、FAC-NOを3から1ずつ増やし、FAC-NO > 8を終了条件とする処理を指定します。
3. 100人未満の施設を表示しない処理も確認します
出力処理では、FAC-CNT(FAC-NO - 2)を100で割った値をMARK-CNTに入れます。記号#一つが100人を表すためです。例えば、利用者数が250人なら、250を100で割った2個の#を表示します。100人未満ならMARK-CNTは0となり、IF MARK-CNT NOT = 0の条件を満たさないので、その施設の行は表示されません。
また、利用者数は5,000人を超えないため、表示する#の数は最大でも50個です。FAC-MARKは#を50個並べた項目なので、施設ごとの利用者数を表示できます。繰返しは、利用者数の大きさではなく、イベントコード03から08までの6施設を確認し終えたところで終了させます。

誤りやすいポイント

  • イベントコードをそのまま配列の添字にしないこと
    イベントコード03から08をそのまま添字にすると、添字1から6の配列に対応しません。2を引いて、03を1、08を6に対応させます。
  • 年齢や入園者番号を加算しないこと
    数えるのは入園者の年齢や番号ではなく、遊戯施設の利用イベントの件数です。1件の利用につき1を加えます。
  • 施設の利用者数と、表示する#の個数を混同しないこと
    FAC-CNTには利用者数を記録します。表示する#の個数は、その利用者数を100で割った値です。100人未満の端数は表示されません。
  • 施設の数え方と、表示するイベントコードの範囲をそろえること
    FAC-CNTは6個ですが、対応するイベントコードは03から08です。FAC-NOを1から6まで動かすのではなく、03から08まで動かします。

FAQ

Q: 「延べ利用者数」は、同じ人が同じ施設を何度も利用した場合、どう数えますか?
A: 利用イベントごとに1を加えます。同じ人が同じ施設を2回利用した場合は、2人分ではなく、延べ利用者数として2回分を数えます。
Q: 利用者数が99人の場合、施設の行は表示されますか?
A: 表示されません。99を100で割ったときの整数部分は0で、MARK-CNTが0になるためです。100人なら#が1個表示されます。
Q: FAC-CNTの添字がイベントコードと違うのはなぜですか?
A: イベントコードは03から08ですが、FAC-CNTは6個を1から6の添字で管理する配列だからです。イベントコードから2を引くことで、6種類の施設に対応させています。

関連キーワード: 配列、添字、条件名、繰返し処理、集計処理

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

この設問をAIに質問する

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

戦国ITクイズ機能

\ せっかくなら /

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

クイズ画面へ遷移する→

すぐに利用可能!

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

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