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

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


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

〔プログラムの説明〕  従業員の社内資格の保有状況を管理するプログラムである。  情報サービス企業であるP社には社内資格として資格1〜4があり、従業員に取得を奨励している。社内資格を取得するための試験(以下、資格試験という)は定期的に実施しており、全従業員の保有状況を保有資格ファイルで管理する。P社の事業年度は4月から翌年3月までであり、上期(4月〜9月)と下期(10月〜翌年3月)の2期から成る。資格試験に合格した従業員の情報は合格ファイルに1期分を蓄積する。上期の合格者を蓄積した合格ファイルは10月初めに、下期の合格者を蓄積した合格ファイルは4月初めにプログラムを実行して、保有資格ファイルに反映する運用である。従業員は、合格した資格試験を再度受験することはない。   (1) 保有資格ファイルは、図1に示すレコード様式の索引ファイルであり、全従業員のレコードが格納されている。主キーは従業員番号である。プログラムでは、乱呼出し法で入出力している。
基本情報技術者試験(平成30年 午後 問10 図1)
 資格1〜4には、従業員番号で示される従業員が各資格試験に合格した日付として、西暦の年、月、日が、それぞれ4桁、2桁、2桁で格納されている。合格していない場合には、0が格納されている。
(2) 合格ファイルは、図2に示すレコード様式の順ファイルであり、資格試験に合格した従業員のレコードが格納されている。同じ従業員が複数の資格試験に合格した場合は、合格した資格試験ごとにレコードが格納されている。レコードは、順序不同で格納されている。
基本情報技術者試験(平成30年 午後 問10 図2)
 ① 資格種別には、合格した資格試験を表す値が、資格1は1で、資格2は2で、資格3は3で、資格4は4で格納されている。  ② 合格日には、合格した日付として、西暦の年、月、日が、それぞれ4桁、2桁、2桁で格納されている。
(3) 保有資格ファイルには、合格ファイルの従業員番号で示される従業員のレコードが必ず存在する。
基本情報技術者試験(平成30年 午後 問10 プログラム)

設問1:

問題文を見る
 プログラム中のに入れる正しい答えを、解答群の中から選べ。
aに関する解答群  ア:MOVE SPACE TO CR-NO  イ:PERFORM UPD-PROC  ウ:PERFORM WRI-PROC  エ:REWRITE QLF-REC   bに関する解答群  ア:CR-NO = SPACE  イ:SRT-NO = CR-NO  ウ:SRT-NO = SPACE  エ:SRT-NO NOT = CR-NO   cに関する解答群  ア:MOVE QLF-DATE(SRT-CD) TO QLF-DATE(SRT-CD + 1)  イ:MOVE SRT-DATE TO QLF-DATE(SRT-CD)  ウ:MOVE SRT-NO TO QLF-DATE(SRT-CD)  エ:MOVE ZERO TO QLF-DATE(SRT-CD)

模範解答

a:ウ、b:エ、c:イ

解説

解答の導き方

このプログラムの目的は、合格ファイルにある合格情報を、保有資格ファイルの従業員ごとのレコードに反映することです。
まず、保有資格ファイルは従業員番号を主キー(レコードを一つに特定する項目)とする索引ファイルです。図1のように、資格1〜4それぞれの合格日を持ちます。一方、合格ファイルには「従業員番号・資格種別・合格日」が1件ずつ格納されています。同じ従業員の合格情報が複数あることもあります。
問題文には、合格ファイルのレコードは「順序不同で格納」とあります。そのため、プログラムは25行目のSORTで従業員番号順に並べ替えます。並べ替えたレコードは、RETURN文で1件ずつ取り出されます。同じ従業員のレコードが続けて処理されるので、その従業員の保有資格レコードを一度読み込み、合格日を追加してから書き戻せます。
次に、bを考えます。CR-NOには、現在処理している従業員番号を記録します。最初はSPACEなので、最初のレコードではSRT-NOと異なります。同じ従業員のレコードが続く間は番号が等しく、別の従業員に変わると番号が異なります。
したがって、従業員が切り替わったときに、前の従業員のレコードを書き戻してから、新しい従業員のレコードを読み込む必要があります。この判定に使う条件は「SRT-NO NOT = CR-NO」です。
条件が成立したときの処理順も大切です。まずWRI-PROCで、現在のQLF-RECを保有資格ファイルに書き戻します。その後、SRT-NOをQLF-NOに移してREADし、新しい従業員の保有資格レコードを読み込みます。最後に、読み込んだ従業員番号をCR-NOに保存します。
ただし、最初のレコードでは、まだ書き戻すべき従業員レコードはありません。WRI-PROCには「CR-NO NOT = SPACE」の場合だけREWRITEする判定があるので、初回は書き戻しが行われません。
cには、取り出した合格情報を、該当する資格の欄へ入れる処理が必要です。SRT-CDには資格種別が1〜4で入っています。また、QLF-DATEは資格1〜4の合格日を4個持つ配列です。配列(同じ形式の値を並べて扱う仕組み)の何番目を使うかをSRT-CDで指定すれば、合格した資格に対応する欄を選べます。
その欄に入れる値は、合格ファイルの合格日であるSRT-DATEです。したがって、SRT-DATEをQLF-DATE(SRT-CD)に移します。資格種別が2なら2番目、資格種別が4なら4番目の合格日欄が更新されます。
最後にaを考えます。従業員番号が切り替わるたびに前のレコードは書き戻されますが、最後の従業員のレコードは、次の従業員が現れないため、その処理の機会がありません。RETURN文がファイルの終端に達したとき、最後に処理していたレコードを書き戻す必要があります。そのため、AT ENDの処理としてWRI-PROCを実行します。合格ファイルが空の場合も、WRI-PROC内の判定によって不要な書き戻しは行われません。

誤りやすいポイント

  • bを「SRT-NO = CR-NO」とすると、同じ従業員のレコードごとに保有資格レコードを読み直すことになります。更新途中の内容を失うおそれがあるため、従業員番号が異なるときに読み込みを行います。
  • 新しい従業員のレコードをREADする前に、前の従業員のレコードを書き戻します。順序を逆にすると、読み込んだQLF-RECによって、書き戻すべき前の内容が置き換わってしまいます。
  • 最後の従業員は、従業員番号の切替えが起きないままファイルの終端に達します。終端時の書き戻しを忘れると、その従業員の更新が反映されません。
  • cで使う添字は、従業員番号ではなく資格種別です。合格日を入れる欄はSRT-CDで選びます。
  • WRI-PROCはREWRITEを行いますが、最初の処理ではまだ既存レコードを読み込んでいません。そのため、CR-NOがSPACEでない場合にだけ書き戻す判定が必要です。

FAQ

Q: なぜ合格ファイルを従業員番号順に並べ替えるのですか?
A: 合格ファイルは順序不同なので、同じ従業員のレコードが連続するとは限りません。従業員番号順に並べることで、同じ従業員の資格情報をまとめて更新できます。
Q: REWRITEはどのような処理ですか?
A: 読み込んだレコードの内容を変更した後、そのレコードをファイルに書き戻す処理です。このプログラムでは、資格の合格日を追加したQLF-RECを保有資格ファイルに反映します。
Q: なぜ、従業員が変わったときとファイル終端の両方で書き戻すのですか?
A: 従業員が変わったときは、次の従業員を読み込む前に前の従業員を保存します。最後の従業員には次の従業員がいないため、ファイル終端で別途保存します。

関連キーワード: 索引ファイル、順ファイル、主キー、ソート、乱呼出し法、配列

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

この設問をAIに質問する

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

 P社では、社内資格を四つ全て取得した従業員を表彰している。合格ファイルの内容を保有資格ファイルに反映するとき、新たに表彰の対象となった従業員の従業員番号を表示するようにプログラムを変更する。表1中のに入れる正しい答えを、解答群の中から選べ。
基本情報技術者試験(平成30年 午後 問10 表1)
dに関する解答群  ア:行番号33と34の間  イ:行番号35と36の間  ウ:行番号42と43の間  エ:行番号46と47の間   eに関する解答群  ア:QLF-DATE(CR-NO) = ZERO  イ:QLF-DATE(W-CNT) = ZERO  ウ:QLF-INF NOT = ALL ZERO  エ:W-CNT > 4

模範解答

d:エ、e:エ

解説

解答の導き方

この変更では、従業員が資格1〜4を全て取得したときに、その従業員番号を表示します。そのためには、同じ従業員の合格情報を保有資格ファイルに反映し終えた後で、資格の保有状況を調べる必要があります。
  1. まず、同じ従業員の合格情報がまとまって処理される理由を確認します。
    合格ファイルのレコードは順不同ですが、プログラムはSORT(並べ替え)で、従業員番号を表すSRT-NOの昇順に並べています。そのため、同じ従業員のレコードは続けて処理されます。
    保有資格ファイルは索引ファイル(キーを使って対象のレコードを指定するファイル)です。従業員番号で該当レコードを読み込み、合格した資格の日付を更新します。同じ従業員に複数の合格レコードがある場合は、それらの更新が全て済んでから、次の従業員の処理に移ります。
  2. 次に、資格の保有状況を調べるのに適した場所を考えます。
    更新したレコードを保有資格ファイルに書き戻す処理は、WRI-PROC内のREWRITEです。REWRITEの直前なら、その従業員の合格情報を反映した後のQLF-RECを調べられます。また、従業員ごとの更新処理が終わった段階なので、同じ従業員番号を何度も表示することも避けられます。
    一方、合格レコードを1件処理するたびに調べると、同じ従業員の処理がまだ続いている途中で判定してしまうことがあります。また、新しい従業員のレコードを読み込んだ直後では、その従業員の合格情報をまだ反映していません。
    したがって、表示処理を追加する場所は、WRI-PROC内でREWRITEを行う直前です。表1の選択肢ではエに当たります。
  3. 最後に、全ての資格を取得したかどうかを判定する条件を考えます。
    QLF-DATEは、資格1〜4の合格日を4個持つ配列(同じ形式の値を並べて扱う領域)です。未合格の資格には0が格納されます。追加するループでは、W-CNTを1から1ずつ増やしながら、QLF-DATE(W-CNT)を調べます。途中で0が見つかれば、まだ取得していない資格があります。
    4個全てが0以外の場合は、4個目まで調べた後にW-CNTが5になります。つまり、W-CNTが4を超えたときは、資格1〜4の全てに合格日があると判断できます。このため、IFの条件はW-CNT > 4です。
    なお、QLF-DATE(W-CNT) = ZEROは、調べた資格が未取得であることを示す条件です。QLF-INF NOT = ALL ZEROは、少なくとも一つの資格の日付が0以外であることしか示さず、4資格全てを取得したとは判断できません。

誤りやすいポイント

  • W-CNT > 4は、資格が4個より多いという意味ではありません。4個全てを調べ終えたことを表します。
  • QLF-DATE(W-CNT) = ZEROは未取得の資格を見つける条件です。全て取得したかどうかの条件として使うと、判定が逆になります。
  • QLF-INF NOT = ALL ZEROは、どれか一つでも合格日があれば成立します。資格1〜4の全てを取得したことは確認できません。
  • 同じ従業員の合格情報が全て反映される前に判定すると、表彰対象であるのに表示できなかったり、同じ従業員を複数回表示したりするおそれがあります。従業員ごとの更新が済むタイミングで判定することが大切です。

FAQ

Q: なぜW-CNTが5になるのですか?
A: W-CNTは1から始まり、1ずつ増えます。QLF-DATE(1)からQLF-DATE(4)まで全て0以外なら、4個目を調べた後に5となり、W-CNT > 4が成立します。
Q: なぜREWRITEの後ではなく、直前に表示するのですか?
A: REWRITEの直前には、合格情報を反映したQLF-RECがメモリー上にあります。その内容を使って、書き戻す前に全ての資格を取得したかどうかを判定できます。
Q: 資格を全て取得済みの従業員が、再び表示されることはありませんか?
A: 合格ファイルには、その期に合格した従業員の情報が格納されます。また、従業員は合格した資格試験を再度受験しません。そのため、表示対象になるのは、新たな合格情報を反映した結果、資格1〜4が全てそろった従業員です。

関連キーワード: COBOL、索引ファイル、順ファイル、ソート、配列

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

この設問をAIに質問する

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

 プログラムを表2に示すとおりに変更して、通常の運用どおり10月初めに実行した。行番号28と29の間に追加したDISPLAY文によって表示される内容に関する説明として適切な答えを、解答群の中から選べ。ここで、プログラムは設問2の変更を行う前のものとする。また、対象となる従業員の数は、10,000未満である。
基本情報技術者試験(平成30年 午後 問10 表2)
解答群  ア:当該事業年度の上期に、各資格試験に合格した従業員の数  イ:当該事業年度の上期に、各資格試験を受験した従業員の数  ウ:当該事業年度の上期までに、各資格試験に合格した従業員の数  エ:当該事業年度の上期までに、各資格試験に合格していない従業員の数

模範解答

ア

解説

解答の導き方

  1. まず、表示する値の作り方を確認します。追加されたW-NUMは4個分の領域で、VALUE ZEROによって最初はすべて0です。SRT-CDの値は資格1なら1、資格2なら2、資格3なら3、資格4なら4なので、W-NUM(SRT-CD)は合格した資格に対応する場所を表します。
  2. プログラムはPAS-FILEのレコードを並べ替えた後、RETURNで1件ずつ取り出します。取り出したレコードごとにUPD-PROCが実行され、追加された「ADD 1 TO W-NUM(SRT-CD)」によって、そのレコードの資格に対応する値が1増えます。
  3. 合格ファイルには、資格試験に合格した従業員の情報が入っています。また、合格した資格試験ごとにレコードが作られます。したがって、W-NUMの各値は、合格ファイルにある資格ごとの合格レコード数を表します。合格した資格試験を再度受験する従業員はいないので、各資格については、レコード数を合格した従業員数として数えられます。
  4. 実行時期は10月初めです。問題文では、上期の合格者を蓄積した合格ファイルを10月初めに処理すると説明されています。つまり、表示されるのは当該事業年度の上期に合格した従業員の数です。試験を受験しただけで合格していない従業員は、合格ファイルにレコードがないため数えられません。
なお、W-NUMは各4桁で、対象となる従業員の数は10,000未満です。そのため、各資格の合格者数を表示する領域として使えます。

誤りやすいポイント

  • 受験した従業員の数と考えないようにします。合格ファイルに入るのは、合格した従業員の情報だけです。
  • 上期までの累計人数と考えないようにします。W-NUMは0から始まり、今回処理する合格ファイルのレコードごとに増えます。
  • 同じ従業員が複数の資格に合格している場合でも、資格ごとに別々に数えます。たとえば資格1と資格2の両方に合格していれば、それぞれの資格の人数に1人分が加わります。

FAQ

Q: 合格ファイルのレコードを数えるだけで、従業員数になるのですか?
A: 合格した資格試験ごとにレコードが作られ、同じ資格試験に合格した従業員は再受験しないため、資格ごとのレコード数を合格した従業員数として数えられます。
Q: 合格ファイルを並べ替えるのは、人数を数えるためですか?
A: 並べ替えは、従業員番号の順にレコードを処理して保有資格ファイルを更新するためです。レコードを並べ替えても、資格ごとの合格レコード数は変わりません。

関連キーワード: 順ファイル、索引ファイル、ソート、配列、カウンター

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

この設問をAIに質問する

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

戦国ITクイズ機能

\ せっかくなら /

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

クイズ画面へ遷移する→

すぐに利用可能!

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

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