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

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


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

〔プログラムの説明〕  ある駐車場では、自動精算システムを導入している。利用者は、入庫時に利用番号と入庫時刻が記録された駐車券を受け取り、出庫時に駐車券を精算機に投入して駐車料金を支払う。連続した複数日にまたがる駐車も可能である。プログラム1は入庫時に入庫時刻を精算ファイルに記録するサブプログラムであり、プログラム2は出庫時に駐車料金を計算して出庫時刻とともに精算ファイルに記録し、駐車料金の値を呼出し元に返すサブプログラムである。 (1) 精算ファイルは、図1に示すレコード様式の索引ファイルであり、プログラムの実行時に既に存在する。主キーは利用番号である。ファイルの排他制御は適切に行われるものとする。
基本情報技術者試験(平成29年 午後 問10 図1)
 ① 利用番号には、入庫時に発券される駐車券ごとに1ずつ増える8桁の数字が格納される。  ② 入庫時刻及び出庫時刻には、西暦の年、月、日と、24時間表記の時(0~23)、分(0~59)が、それぞれ4桁、2桁、2桁、2桁で格納される。
(2) プログラム1のパラメタの様式は、図2のとおりである。呼出し元プログラムから利用番号と入庫時刻を受け取る。
基本情報技術者試験(平成29年 午後 問10 図2)
(3) プログラム2のパラメタの様式は、図3のとおりである。呼出し元プログラムから利用番号と出庫時刻を受け取り、駐車料金の値を返す。
基本情報技術者試験(平成29年 午後 問10 図3)
(4) 駐車料金は、入庫時刻を基準に駐車時間を1時間単位に区切って算出する。この単位を課金単位と呼び、1課金単位当たり300円を課金する。各課金単位の開始時刻の“分”は、入庫時刻と同じ“分”とする。各課金単位の開始時刻から1分以上が経過すると課金対象になる。例えば、10時30分に入庫して、11時30分に出庫した場合、課金単位は1で、駐車料金は300円である。10時30分に入庫して、11時31分に出庫した場合、2時間目の課金単位の開始時刻である11時30分から1分が経過しているので、課金単位は2となり、駐車料金は600円になる。駐車料金が999,999円を超えることはない。
(5) プログラム2の中で使用している組込み関数INTEGER-OF-DATEは、引数に指定された日付を西暦1601年1月1日からの通算の日数に変換して返す。
基本情報技術者試験(平成29年 午後 問10 プログラム1)
基本情報技術者試験(平成29年 午後 問10 プログラム2)

設問1:

問題文を見る
 プログラム1における精算ファイルの呼出し法として正しい答えを、解答群の中から選べ。ここで、括弧内は、呼出し法に対応する環境部のファイル管理記述項におけるACCESS MODE句の書き方である。   解答群  ア:順呼出し (ACCESS MODE IS SEQUENTIAL)  イ:動的呼出し (ACCESS MODE IS DYNAMIC)  ウ:乱呼出し (ACCESS MODE IS RANDOM)

模範解答

ア

解説

解答の導き方

この設問では、プログラム1が精算ファイルのレコードをどのように扱うかを見て、適切な呼出し法を選びます。COBOL(Common Business-Oriented Language:事務処理向けに作られたプログラミング言語)では、ACCESS MODE句でレコードへのアクセス方法を指定します。
  1. 精算ファイルは、利用番号を主キー(レコードを一つに特定する項目)とする索引ファイルです。索引ファイルは、主キーを使ってレコードを管理するファイルです。ただし、索引ファイルだからといって、必ず特定の呼出し法になるわけではありません。実際のプログラムの処理方法を確認します。
  2. プログラム1では、「OPEN EXTEND ACCT-FILE」の後に、利用番号と入庫時刻をレコードに設定し、「WRITE ACCT-REC」で書き込んでいます。既存のレコードを読み込んで探したり、書き換えたりする処理はありません。新しいレコードを追加する処理です。
  3. 問題文には、利用番号は「1ずつ増える8桁の数字」とあります。つまり、新しいレコードの利用番号は順に増えていきます。レコードを順番に書き込む処理に合うのは、順呼出しです。
  4. 乱呼出しは、主キーなどを指定して、必要なレコードへ直接アクセスする方法です。動的呼出しは、順番にアクセスする方法と、特定のレコードへ直接アクセスする方法の両方を使う場合に選びます。プログラム1では、そのような読み込みや更新をしていないため、これらを選ぶ理由はありません。
したがって、プログラム1に適するのは順呼出しです。

誤りやすいポイント

  • 索引ファイルを使っていることだけを見て、乱呼出しや動的呼出しを選ばないようにします。ファイルの種類ではなく、プログラムがレコードをどう扱うかが判断の基準です。
  • 利用番号を指定しているからといって、乱呼出しとは限りません。このプログラムでは、利用番号を新しいレコードの主キーとして設定して書き込んでいます。
  • 「OPEN EXTEND」は、既存のファイルにレコードを追加するための開き方を示します。ACCESS MODE句が指定するレコードのアクセス方法とは別のことです。

FAQ

Q: 新しいレコードを書き込む処理なら、必ず順呼出しですか?
A: 必ずではありません。設問では、利用番号が順に増え、プログラムもレコードを順番に追加するため、順呼出しが適しています。
Q: 動的呼出しは、どのような場合に使いますか?
A: レコードを順番に処理することも、主キーなどを指定して特定のレコードにアクセスすることも、同じプログラムで行う場合に使います。
Q: 「OPEN EXTEND」と「順呼出し」は同じ意味ですか?
A: 同じ意味ではありません。「OPEN EXTEND」はファイルへの追加を目的とした開き方で、順呼出しはレコードへのアクセス方法です。

関連キーワード: 索引ファイル、主キー、順呼出し、乱呼出し、動的呼出し

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

この設問をAIに質問する

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

 プログラム2中のに入れる正しい答えを、解答群の中から選べ。   aに関する解答群  ア:ADD PRM-FEE TO ACCT-FEE  イ:MOVE ACCT-FEE TO PRM-FEE  ウ:MOVE PRM-FEE TO ACCT-FEE  エ:MOVE PRM-NO TO ACCT-NO   bに関する解答群  ア:*  イ:+  ウ:-  エ:/   cに関する解答群  ア:ADD 1 TO W-HRS  イ:ADD ACCT-O-HH TO W-HRS  ウ:SUBTRACT 1 FROM W-HRS  エ:SUBTRACT ACCT-I-HH FROM W-HRS

模範解答

a:イ、b:ウ、c:ア

解説

解答の導き方

この問題では、プログラム2が駐車料金を計算し、その料金を精算ファイルに記録すると同時に、呼出し元にも返す流れを考えます。空欄は、料金を返す処理、駐車時間の計算、分による課金単位の調整に対応しています。
1. aには、計算した料金を呼出し元へ渡す処理が入ります。
プログラム2では、31行目のCOMP-PROCで駐車料金を計算します。計算結果は、精算ファイルのレコードにあるACCT-FEEに入ります。
一方、図3では、プログラム2のパラメタに「駐車料金」があります。呼出し元に料金を返すには、計算結果をこのパラメタであるPRM-FEEに移す必要があります。
つまり、移す向きは「ACCT-FEEからPRM-FEE」です。したがって、aには「MOVE ACCT-FEE TO PRM-FEE」が入り、解答群ではイです。
その後の33行目のREWRITEは、読み込んだレコードの内容を更新する処理です。計算した料金をACCT-FEEに入れた状態でREWRITEすることで、出庫時刻と料金が精算ファイルに記録されます。
2. bでは、出庫時刻から入庫時刻までの時間を求めます。
本文には、日付を通算の日数に変換するINTEGER-OF-DATEの説明があります。日付を通算の日数に直してから24を掛けると、その日付の時間部分を「通算の時間」に換算できます。そこに時を加えることで、日付と時を合わせた値になります。
したがって、出庫時刻と入庫時刻の差は、次の式で求められます。
この引き算によって、日をまたいだ駐車でも時間差を計算できます。例えば、出庫が入庫の翌日であっても、日付の差が時間差に反映されます。
よって、bには引き算の「-」が入り、解答群ではウです。
3. cでは、分を比べて課金単位を1増やすか判断します。
bの計算で得られるW-HRSは、日付と時だけを使った時間差です。入庫時の分と出庫時の分は、まだ反映されていません。
本文では、「各課金単位の開始時刻から1分以上が経過すると課金対象」とされています。そのため、出庫時の分が入庫時の分より後なら、次の課金単位の開始時刻を過ぎています。課金単位を1増やす必要があります。
例えば、10時30分に入庫して11時31分に出庫した場合、日付と時だけの差は1時間です。しかし、出庫時の分は入庫時の分より後なので、2時間目の課金単位に入っています。W-HRSに1を加えて、課金単位を2にします。
一方、10時30分に入庫して11時30分に出庫した場合は、分が同じです。次の課金単位の開始時刻から1分以上は経過していないため、加算しません。
したがって、ACCT-I-MMがACCT-O-MMより小さいときに「ADD 1 TO W-HRS」を実行するのが適切です。cには解答群のアが入ります。その後、43行目で課金単位数に300を掛け、ACCT-FEEに駐車料金を求めます。

誤りやすいポイント

  • 料金を移す向きを逆にしないこと
    ACCT-FEEはプログラム2で計算した料金です。呼出し元へ返すため、ACCT-FEEからPRM-FEEへ移します。
  • 日付を無視して時だけを引かないこと
    駐車は複数日にまたがることがあります。INTEGER-OF-DATEで日付を時間に換算してから差を求めることで、日をまたぐ場合にも対応できます。
  • 分の比較条件を逆にしないこと
    出庫時の分が入庫時の分より後なら、次の課金単位に入っています。条件はACCT-I-MM < ACCT-O-MMです。
  • 分が同じ場合に課金単位を増やさないこと
    例えば10時30分から11時30分までは、ちょうど1時間です。次の課金単位の開始時刻から1分以上は経過していないため、加算しません。

FAQ

Q: INTEGER-OF-DATEで日付を通算日数に変えるのはなぜですか?
A: 日付をそのまま時刻として引き算することはできないためです。通算日数に24を掛けて時に換算すれば、日付をまたいだ時間差も計算できます。
Q: 出庫時の分が入庫時の分より小さい場合は、なぜ加算しないのですか?
A: 時だけで計算した時間差が、すでに課金単位数として適切だからです。例えば10時30分から11時29分までは、1時間の課金単位に収まっています。
Q: REWRITEは何をしていますか?
A: 読み込んだレコードを、変更後の内容で更新しています。このプログラムでは、出庫時刻と計算した駐車料金を精算ファイルに記録します。

関連キーワード: COBOL、索引ファイル、主キー、レコード更新、日付計算、課金単位

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

この設問をAIに質問する

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

 夜間時間帯の料金割引を実施するために、プログラム2を変更する。夜間時間帯は20時00分から翌朝5時59分までとし、各課金単位の開始時刻が夜間時間帯に含まれるときは、1課金単位当たりの課金を100円とする。表1中のに入れる正しい答えを、解答群の中から選べ。
基本情報技術者試験(平成29年 午後 問10 表1)
dに関する解答群  ア:COMPUTE W-IDX = ACCT-I-HH + 1  イ:COMPUTE W-IDX = ACCT-I-HH - 1  ウ:MOVE 1 TO W-IDX  エ:MOVE ACCT-I-HH TO W-IDX   e, fに関する解答群  ア:W-CNT = W-HRS  イ:W-CNT > W-HRS  ウ:W-HRS = W-IDX  エ:W-IDX = 24  オ:W-IDX = W-CNT  カ:W-IDX > 24

模範解答

d:ア、e:イ、f:カ

解説

解答の導き方

この変更では、駐車時間の各課金単位について「開始時刻が夜間時間帯かどうか」を調べ、該当する料金を合計します。問題文には「夜間時間帯は20時00分から翌朝5時59分まで」とあります。そのため、開始時刻の「時」が0~5または20~23なら100円、それ以外なら300円です。
まず、料金表の番号と時刻の対応を確認します。
プログラムでは、W-ACCT-VALにある72桁の文字列を、REDEFINES(同じデータを別の形式で扱う指定)によって、W-ACCTという24個の要素として扱っています。各要素は3桁なので、1つの要素に1時間分の料金が入ります。このように、同じ形式の値を順に並べ、番号で取り出せるものを配列といいます。
文字列の料金を時刻に対応させると、次のようになります。
時の範囲W-ACCTの番号1課金単位当たりの料金
0~51~6100円
6~197~20300円
20~2321~24100円
ここで、時刻の「時」は0から始まりますが、配列の番号は1から始まります。たとえば、0時の料金はW-ACCT(1)、23時の料金はW-ACCT(24)です。
dは、入庫時刻の「時」を料金表の番号に変換します。
W-IDXは、配列の何番目を参照するかを示す番号です。この番号を添字といいます。入庫時刻が0時なら1番目、1時なら2番目になるように、W-IDXにはACCT-I-HHより1大きい値を設定する必要があります。
したがって、dには「COMPUTE W-IDX = ACCT-I-HH + 1」を入れます。選択肢ではアです。
eは、課金単位の数だけ料金を加算するための終了条件です。
W-HRSは、料金を加算する回数です。プログラムでは、入庫時と出庫時の日付・時刻から駐車時間を求め、分の条件も使って課金単位の数を調整しています。例えば、10時30分に入庫し、11時31分に出庫した場合、2課金単位になります。
W-CNTは、繰返し処理の回数を数える変数です。PERFORM TEST BEFOREは、繰返しの処理を実行する前に終了条件を調べる指定です。終了条件が成り立つと、その回の処理は行いません。
たとえばW-HRSが3なら、W-CNTが1、2、3のときに料金を加算し、4になった時点で終了する必要があります。
判定時のW-CNTW-CNT > W-HRS(W-HRSが3の場合)処理
1偽1回目の料金を加算
2偽2回目の料金を加算
3偽3回目の料金を加算
4真終了
そのため、条件は「W-CNT > W-HRS」です。選択肢ではイです。W-CNTがW-HRSと等しいときに終了すると、最後の1回分を加算できません。
fは、日付が変わっても料金表を正しく参照するための処理です。
W-IDXは、料金を加算するたびに1増えます。24番目の次は25番目ではなく、料金表の先頭である1番目に戻す必要があります。したがって、W-IDXが24を超えたときに1へ戻します。fには「W-IDX > 24」が入り、選択肢ではカです。
例えば、23時30分に入庫し、翌日の0時31分に出庫した場合を考えます。課金単位は2です。最初は23時に対応するW-ACCT(24)の100円を加算します。次にW-IDXが25になり、24を超えるので1へ戻ります。2回目は0時に対応するW-ACCT(1)の100円を加算します。このようにして、日付をまたいでも料金表の先頭から正しく参照できます。

誤りやすいポイント

  • W-IDXに時刻の「時」をそのまま入れること
    時刻の「時」は0~23ですが、配列の番号は1~24です。時刻の「時」に1を足す必要があります。
  • 終了条件をW-CNT = W-HRSにすること
    条件は処理の前に判定されます。W-CNTがW-HRSと等しくなった時点で終了すると、その回の料金が加算されません。
  • W-IDXが24になった時点で1へ戻すこと
    24番目は23時の料金を参照するために必要です。24を超えたときに初めて1へ戻します。
  • W-HRSとW-IDXを同じ意味だと考えること
    W-HRSは料金を加算する回数、W-IDXは料金表から料金を取り出す位置です。

FAQ

Q: なぜ料金表の要素は24個なのですか?
A: 1日の「時」は0~23の24種類だからです。料金表では、配列の番号1~24をそれぞれの時刻に対応させています。
Q: 日付をまたいだ場合、どのように駐車時間を計算しますか?
A: INTEGER-OF-DATEで日付を通算日数に変換し、24を掛けて時刻を加えることで、日付をまたぐ時間の差を計算できます。その後、分の条件を使って課金単位の数を調整します。
Q: 夜間料金かどうかの判定に、分は使わないのですか?
A: 各課金単位の開始時刻の「分」は入庫時刻と同じです。夜間時間帯は20時00分から翌朝5時59分までなので、開始時刻の「時」が0~5または20~23なら夜間料金になります。

関連キーワード: COBOL、配列、添字、ループ処理、条件判定、日付変換

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

この設問をAIに質問する

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

戦国ITクイズ機能

\ せっかくなら /

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

クイズ画面へ遷移する→

すぐに利用可能!

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

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