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

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


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

〔プログラムの説明〕  ある有料自動車道路にはA〜Jの順に10か所のインターチェンジ(以下、ICという)があり、すべてのICに自動発券精算システムを導入することにした。すべてのICには一般道路からの出入口があり、利用者は、入ったIC(以下、入車ICという)で発券された通行券を、出たIC(以下、出車ICという)の精算機に投入し、利用区間に応じた通行料を支払う。システムは計算センタとオンラインで結ばれており、通行料は出車ICの売上として売上ファイルに記録される。  このプログラムは、売上ファイルを読み込み、各ICの売上、及び利用区間とその利用台数を台数の多い順に10区間まで、図1に示す形式で表示する。
基本情報技術者試験(平成22年 午後 問10 図1)
(1) 売上ファイルは、図2に示すレコード様式の順ファイルである。
基本情報技術者試験(平成22年 午後 問10 図2)
 ① 車1台の1回の利用につき1レコードが生成され、一つのファイルには1日分の売上が記録されている。  ② 入車IC及び出車ICには、各ICに対応する01〜10の番号が格納される。Aは01、Bは02、…、Jは10とする。 (2) 各ICの1日の売上は999,999円以下とする。 (3) 1日の利用台数は99,999台以下とする。 (4) 利用台数の多い順に10区間までを表示する際、10区間目と台数が同じ利用区間が複数ある場合は、それらの利用区間もすべて表示する。ただし、利用台数がゼロになった場合は、表示が10区間に満たなくても処理を終了する。 (5) Uターン及び同じICからの入出車はないものとする。
基本情報技術者試験(平成22年 午後 問10 プログラム)

設問1:

問題文を見る
 プログラム中のに入れる正しい答えを、解答群の中から選べ。   a~cに関する解答群  ア:ADD SECT-NUM(SAL-IN SAL-OUT) TO TOTAL  イ:ADD 1 TO IC-TOTAL(CNT1)  ウ:ADD 1 TO SECT-NUM(SAL-IN SAL-OUT)  エ:ADD IC-TOTAL(CNT1) TO SECT-NUM(SAL-IN SAL-OUT)  オ:ADD IC-TOTAL(CNT1) TO TOTAL  カ:MOVE IC-TOTAL(CNT1) TO SORT-DATA  キ:MOVE SECT-NUM(CNT1 CNT2) TO SORT-DATA   dに関する解答群  ア:CNT1 > 10 AND PREV-NUM <= 10  イ:CNT1 > 10 AND SORT-DATA < PREV-NUM  ウ:CNT1 > 10 AND SORT-DATA <= PREV-NUM  エ:CNT1 > 10 AND SORT-DATA >= PREV-NUM  オ:SORT-IN > 10 AND SORT-OUT > 10

模範解答

a:ウ、b:オ、c:キ、d:イ

解説

解答の導き方

このプログラムは、売上ファイルの各レコードを読み込み、ICごとの売上と、入車IC・出車ICの組合せごとの利用台数を集計します。その後、利用台数の多い区間から順に表示します。
COBOL(Common Business-Oriented Language:事務処理向けのプログラミング言語)では、OCCURSを使って同じ形式のデータを複数個用意できます。このプログラムでは、入車ICと出車ICの組合せごとの利用台数を、2段階の配列で管理しています。配列とは、同じ種類の値を並べて扱う入れ物です。
  1. a:利用区間ごとの台数を数える
    問題文には「車1台の1回の利用につき1レコードが生成」とあります。つまり、売上ファイルのレコードを1件読んだら、その利用区間の台数を1増やします。
    レコードの入車ICはSAL-IN、出車ICはSAL-OUTに入っています。そのため、増やす場所は入車ICと出車ICを指定した SECT-NUM(SAL-IN SAL-OUT) です。
    例えば、入車ICが02、出車ICが05のレコードを読んだときは、その組合せの利用台数を1増やします。通行料SAL-TOLLを加えるのではなく、台数を数えるために1を加えるので、aは ウ です。
  2. b:各ICの売上を合計する
    52行目では、通行料SAL-TOLLを出車ICに対応するIC-TOTALへ加えています。問題文にも、通行料は出車ICの売上として記録するとあります。
    55行目から60行目では、CNT1を1から10まで変えながら、各ICの売上を表示しています。各ICの売上を表示するだけでなく、TOTALにも加えれば、すべてのICの売上合計を計算できます。したがって、bは ADD IC-TOTAL(CNT1) TO TOTAL となり、解答群では オ です。
  3. c:利用台数を並べ替え対象に登録する
    68行目から75行目では、CNT1とCNT2をそれぞれ1から10まで変え、入車ICと出車ICの全ての組合せを調べています。
    70行目でCNT1をSORT-INに、71行目でCNT2をSORT-OUTに入れています。次に、その組合せの利用台数をSORT-DATAに入れてから、73行目のRELEASEで並べ替え対象に登録します。SORT-DATAの値が大きい順に並べ替えるため、cには MOVE SECT-NUM(CNT1 CNT2) TO SORT-DATA が必要です。解答群では キ です。
  4. d:10区間目と同じ台数の区間も表示する
    SORTによってSORT-DATAは利用台数の多い順に並んでいます。OUT-PROCでは、SORT-DATAがゼロなら、表示する利用区間がなくなったので処理を終了します。
    また、CNT1が10を超えた後は、10区間目の台数と現在のSORT-DATAを比べます。PREV-NUMには、直前に表示したSORT-DATAが入っています。10区間目と同じ台数の区間も表示するには、現在の台数がPREV-NUMと等しいときは終了せず、現在の台数がPREV-NUMより小さいときに終了します。
    その条件は CNT1 > 10 AND SORT-DATA < PREV-NUM なので、dは イ です。比較を「小さいとき」にすることで、10区間目と同じ台数の区間を続けて表示できます。

誤りやすいポイント

  • aで通行料を加えてしまう
    aで数えるのは利用台数です。1レコードが1台の利用を表すため、台数には1を加えます。通行料は52行目でIC-TOTALに集計しています。
  • bでICごとの売上をもう一度集計するだけで、全体の合計を作らない
    IC-TOTALは各ICの売上です。TOTALに各IC-TOTALを順に加えると、全ICの売上合計になります。
  • cでSORT-INやSORT-OUTの値をSORT-DATAに入れる
    SORT-INとSORT-OUTは、どの入車IC・出車ICの組合せかを示します。並べ替えの順序を決める値は利用台数なので、SORT-DATAにはSECT-NUMの値を入れます。
  • dで「同じ台数」の区間も終了対象にする
    SORT-DATAがPREV-NUMと等しいときに終了すると、10区間目と同じ台数の区間を表示できません。終了条件はSORT-DATAがPREV-NUMより小さいときです。

FAQ

Q: なぜ利用台数は通行料から計算しないのですか?
A: 売上ファイルでは1台の利用につき1レコードが作られます。そのため、レコードを読むたびに対応する利用区間の台数を1増やせば数えられます。通行料は別に、ICごとの売上として集計します。
Q: 10区間目と同じ台数の区間は、なぜ10区間を超えても表示するのですか?
A: 問題文で、10区間目と台数が同じ利用区間もすべて表示すると指定されています。そのため、10区間を超えた後も、台数が10区間目と同じ間は表示を続けます。
Q: 利用台数がゼロの区間も並べ替えの対象になるのですか?
A: 入車ICと出車ICの組合せを並べ替え対象に登録しますが、SORT-DATAがゼロになった時点で表示処理を終了します。利用台数がある区間だけが表示されます。

関連キーワード: 順ファイル、配列、集計、降順ソート、同順位処理

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

この設問をAIに質問する

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

 この道路の運営会社では、利用区間に応じた料金の割引きを検討している。売上への影響を検証した上で、次の二つのプランのいずれかを採用することにした。  なるべく新しいデータで検証するため、ある期間だけプログラムを変更して、それぞれのプランを適用した場合の売上を表示することにした。図3に変更後の表示形式を示す。次の表中のに入れる正しい答えを、解答群の中から選べ。
 プランX:5区間以上利用した場合は20%、通行料を割り引く。  プランY:3~6区間利用した場合は10%、7区間以上利用した場合は20%、通行料を割り引く。
基本情報技術者試験(平成22年 午後 問10 図3)
基本情報技術者試験(平成22年 午後 問10 表)
eに関する解答群  ア:行番号47と48  イ:行番号53と54  ウ:行番号54と55  エ:行番号60と61   f~hに関する解答群  ア:1 THRU 2  イ:3  ウ:3 THRU 4  エ:3 THRU 5  オ:5  カ:5 THRU 6  キ:5 THRU 7  ク:7  ケ:7 THRU 9

模範解答

e:イ、f:ウ、g:カ、h:ケ

解説

解答の導き方

この設問では、割引後の売上を計算する処理をどこに追加するか(e)と、利用区間の長さごとに適用する割引係数(f~h)を考えます。
まず、処理を追加する場所を確認します。問題文には「車1台の1回の利用につき1レコードが生成」とあります。また、プログラムでは売上ファイルの各レコードを読むたびに、行番号45で「NOT AT END PERFORM CNT-PROC」を実行します。つまり、CNT-PROCは1回の利用データごとに呼び出されます。
割引後の売上を合計するには、各利用データの入車IC、出車IC、通行料を使って計算し、その結果を合計に加える必要があります。そのため、処理は1レコードごとに実行されるCNT-PROCの中に置きます。
行番号53と54の間なら、行番号51の「CNT-PROC SECTION.」から次の「PRINT-PROC SECTION.」までの範囲に追加できます。したがって、eはイです。
行番号47と48の間では、売上ファイルを読み終えた後の処理になります。その時点では各レコードを順に処理できません。また、行番号54以降は表示を行う部分なので、ここに置いても利用データごとの割引計算にはなりません。
次に、区間の数を求めます。ICにはAからJまで順に01から10の番号が付いています。隣り合うICの間を1区間と数えるので、入車ICと出車ICの番号の差が利用区間数です。
プログラムでは、SAL-INがSAL-OUTより小さいときはSAL-OUTからSAL-INを引き、そうでないときはSAL-INからSAL-OUTを引きます。つまり、どちら向きに走っても、区間数は2つの番号の差になります。例えば、02から05までなら、05 − 02 = 3区間です。ICの数そのものではなく、ICとICの間の数を数えるため、1を足す必要はありません。
プランごとの割引を、通行料に掛ける係数で整理します。割引なしなら1.0、10%割引なら0.9、20%割引なら0.8です。例えば、通行料に0.9を掛けると、元の通行料の90%を支払う計算になります。
利用区間数プランXの係数プランYの係数
1~2区間1.01.0
3~4区間1.00.9
5~6区間0.80.9
7~9区間0.80.8
プランXは5区間以上で20%割引です。プランYは3~6区間で10%割引、7区間以上で20%割引です。このため、3~4区間ではプランXが1.0、プランYが0.9となり、fには「3 THRU 4」が入ります。解答群ではウです。
5~6区間では、プランXが0.8、プランYが0.9となります。したがって、gには「5 THRU 6」が入り、解答群ではカです。
7区間以上では両方のプランが20%割引です。ICは10か所なので、最大の区間数はAからJまでの9区間です。したがって、hには「7 THRU 9」が入り、解答群ではケです。

誤りやすいポイント

  • 利用区間数に1を足してしまう
    02から05までは、通過するICの数ではなく、IC間の区間数を数えます。02–03、03–04、04–05の3区間なので、番号の差は3です。
  • 割引率をそのまま掛けてしまう
    10%割引で掛けるのは0.1ではありません。支払う金額は元の90%なので、係数は0.9です。同様に、20%割引なら係数は0.8です。
  • プランごとの割引開始区間を混同する
    プランXは5区間以上から、プランYは3区間以上から割引されます。3~4区間では、プランXは割引なし、プランYは10%割引です。
  • 最大区間数を10と考えてしまう
    ICは10か所ありますが、AからJまでの間は9区間です。そのため、最後の範囲は7~9区間です。

FAQ

Q: なぜ割引後の金額を利用データごとに計算するのですか?
A: 割引率は利用区間数によって変わるためです。各利用データについて区間数を調べ、通行料に適切な係数を掛けてから合計します。
Q: 入車ICの番号が出車ICの番号より大きい場合も、同じ引き算でよいのですか?
A: はい。プログラムは番号の大小を比べ、大きい番号から小さい番号を引きます。そのため、どちら向きの利用でも区間数を正しく求められます。
Q: 「5 THRU 6」のTHRUは何を表しますか?
A: 5から6までの範囲を表します。この場合は、5区間または6区間の利用が該当します。

関連キーワード: 条件分岐、累積処理、配列、割引係数、順ファイル

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

この設問をAIに質問する

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

戦国ITクイズ機能

\ せっかくなら /

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

クイズ画面へ遷移する→

すぐに利用可能!

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

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