基本情報技術者 2010年 春期 午後 問10
次のCOBOLプログラムの説明及びプログラムを読んで、設問1〜3に答えよ。
〔プログラム1の説明〕
G社では、セキュリティ対策のため、入退室時のIDカード操作によって資格保有者以外の立入りを禁止し、かつ、入室者の入退室日時を記録しておくセキュリティルームを設置した。プログラム1は、セキュリティルームを管理するシステムのサブプログラムであり、処理コードと従業員番号を受け取って、結果コードを返す。
(1) パラメタの形式は、図1のとおりである。

① 処理コードには、入室時には1が、退室時には2が設定される。
② 結果コードには、入室時に入室を許可する場合は0を、許可しない場合は、事象に対応するコードを設定する。退室時には0を設定する。
(2) 従業員ファイルは、従業員番号をキーとする、図2に示すレコード様式の索引ファイルである。

① 従業員番号には、従業員に対して一意に割り振られた8けたの数字が設定される。ただし、従業員番号0の従業員はいない。
② 職級には、当該従業員の職級が設定される。一般社員、係長、課長、部長に対する値として、それぞれ1、2、3、4が設定される。
③ 一般社員及び係長の資格には、入室許可申請によって入室を許可された場合には1が、許可されていない場合には0が設定される。課長及び部長の資格に格納される値は不定である。
(3) セキュリティルームに入室できるのは、課長、部長、入室を許可された一般社員及び入室を許可された係長である。
(4) セキュリティルーム内に同時に在室できる人員は99名までとする。
(5) 入室者の入退室日時を記録する入退室ログファイルは、図3に示すレコード様式の順ファイルである。

① 入退室コードには、入室記録の場合は1が、退室記録の場合は2が設定される。
② 入退室日時には、西暦の日付と24時間表記の時刻を格納する。この情報は、組込み関数CURRENT-DATEの関数値の先頭14文字を使用する。
③ レコードは、入退室処理時に出力する。したがって、このファイル中の全レコードは、入退室日時の昇順に整列されている。
④ セキュリティルームを管理するシステムは、メンテナンスのため月末の深夜に一時運用を停止して、入退室ログファイルを新しいファイルに切り換える。
なお、メンテナンス開始時はセキュリティルーム内を無人にし、完了するまで入室を禁止する。したがって、同一人物による入室と退室のレコードは必ず対で格納される。
(6) このプログラムは、最初に呼び出されたときを除き、CANCEL文などによって初期状態になることはない。
(7) セキュリティルームには、本人のIDカードを使って1人ずつ入退室する。セキュリティルームの入退室はすべて記録される。

設問1:
問題文を見る プログラム中のに入れる正しい答えを、解答群の中から選べ。
aに関する解答群
ア:EMP-CLASS <= 2
イ:EMP-CLASS <= 2 AND EMP-QUAL = 0
ウ:EMP-CLASS <= 2 OR EMP-QUAL = 0
エ:EMP-QUAL = 0
bに関する解答群
ア:ADD 1 TO CNT
イ:MOVE ZERO TO CNT
ウ:SET CD-ENTER TO TRUE
エ:SET CD-EXIT TO TRUE
模範解答
a:イ、b:ア
解説
解答の導き方
この問題では、aで「入室を認めない人」を判定し、bで「現在の在室人数」を更新します。COBOL(Common Business-Oriented Language:業務処理向けのプログラミング言語)のプログラムを、順に見ていきます。
-
aには、入室を認めない条件が入ります。問題文では、一般社員と係長は資格がある場合に入室でき、課長と部長は入室できると説明されています。職級の値は、一般社員と係長がそれぞれ1、2で、課長と部長がそれぞれ3、4です。したがって、入室できないのは「職級が1か2で、資格が0」の人です。二つの条件を両方満たす必要があるため、条件は次のとおりです。EMP-CLASS <= 2 AND EMP-QUAL = 0これに当てはまる選択肢はイです。EMP-CLASS <= 2だけだと、資格のある一般社員や係長まで入室不可になります。また、EMP-QUAL = 0だけだと、資格の値が不定である課長や部長まで誤って入室不可にする可能性があります。
-
bには、入室を許可した後の人数の加算が入ります。CNTは、現在セキュリティルーム内にいる人数を数える変数です。プログラムは入室時に、先に職級と資格を確認し、その後でCNTが99以上かを調べます。CNTが99未満なら、入室記録を出力してから、入室者を1人分として数える必要があります。そのため、CNTに1を加える処理を選びます。該当する選択肢はアです。たとえば、CNTが98のときは入室を許可してCNTを99にします。次の入室時にはCNTが99なので、入室を許可しません。これにより、同時に在室できる人数を99名までにできます。また、退室時の処理では、入退室記録を出力した後にCNTから1を引いています。入室時に1を加え、退室時に1を引くことで、CNTが現在の在室人数を表します。問題文のとおり、このプログラムは最初の呼出し後に初期状態へ戻らないので、CNTの値は呼出しのたびに引き継がれます。
誤りやすいポイント
- aは「入室できる人の条件」ではなく、「入室を認めない人の条件」です。プログラムでは、この条件に当てはまると結果コード3を設定します。
- 職級が1か2というだけでは、資格のある一般社員や係長まで拒否してしまいます。資格の有無も条件に含めます。
- EMP-QUALの値は、課長と部長については不定です。そのため、資格だけを見て入室可否を判断できません。
- bでCNTを0に戻すと、それまでの在室人数が消えてしまいます。また、処理コードを入室用・退室用に設定する処理も、人数を数える目的には合いません。
FAQ
Q: CNTが99のとき、なぜ入室を拒否するのですか?
A: すでに99名が在室しているためです。さらに1人を入室させると、同時に在室できる上限を超えてしまいます。
A: すでに99名が在室しているためです。さらに1人を入室させると、同時に在室できる上限を超えてしまいます。
Q: 入室が許可されなかった場合も、CNTに1を加えますか?
A: 加えません。人数を増やす処理は、入室記録を出力する分岐の中にあります。資格がない場合や、満員の場合はその分岐に進みません。
A: 加えません。人数を増やす処理は、入室記録を出力する分岐の中にあります。資格がない場合や、満員の場合はその分岐に進みません。
Q: 退室時にCNTを減らすのはなぜですか?
A: 退室した人は、部屋の中にいる人数から外れるためです。入室時の加算と退室時の減算で、CNTを在室人数に合わせます。
A: 退室した人は、部屋の中にいる人数から外れるためです。入室時の加算と退室時の減算で、CNTを在室人数に合わせます。
関連キーワード: COBOL、条件分岐、条件名、カウンタ変数、索引ファイル
設問2:
問題文を見る パラメタで渡された従業員番号が、従業員ファイル中に存在しなかった場合に設定する結果コードを、解答群の中から選べ。
解答群
ア:1
イ:2
ウ:3
エ:4
模範解答
イ
解説
解答の導き方
設問は、パラメタで渡された従業員番号が従業員ファイルにない場合、どの結果コードが設定されるかを尋ねています。
まず、処理コードが入室を表す「1」の場合、プログラムは「QUAL-CHECK」を実行します。入室時には従業員の資格を確認するためです。
「QUAL-CHECK」では、パラメタの従業員番号「PRM-EMP」を、従業員ファイルの検索に使う「EMP-NO」に移してから、従業員ファイルを読み込みます。従業員ファイルは、従業員番号をキー(レコードを探すための目印となる項目)とする索引ファイル(キーを使って該当するレコードを探せるファイル)です。
指定した従業員番号が見つからないと、「INVALID KEY」の処理に進みます。そこには「MOVE 2 TO PRM-RTN」とあるため、結果コード「PRM-RTN」に「2」が設定されます。解答群では「2」はイに当たります。
一方、資格や在室人数を確認する処理は、従業員番号が見つかった場合に進みます。従業員番号が見つからない場合に設定される結果コードは、これらの確認結果とは別です。
誤りやすいポイント
- 資格がない場合の結果コードと、従業員番号が見つからない場合の結果コードを混同しないようにします。従業員番号が見つからない場合は、「INVALID KEY」の処理で結果コードが設定されます。
- 結果コードは、処理の最初に「0」に設定されます。ただし、問題が起きたときは、その後の処理で別の値に変更されます。
- 従業員番号が見つからない場合は、資格や在室人数の確認には進みません。
FAQ
Q: 結果コードは、最初に「0」に設定されるのに、なぜ「2」になるのですか?
A: 従業員番号を検索した結果、該当するレコードが見つからないと、「INVALID KEY」の処理で「2」に上書きされるからです。
A: 従業員番号を検索した結果、該当するレコードが見つからないと、「INVALID KEY」の処理で「2」に上書きされるからです。
Q: 結果コード「3」は、従業員番号が見つからない場合の値ですか?
A: いいえ。「3」は、従業員番号が見つかった後に資格を確認する処理で設定されます。
A: いいえ。「3」は、従業員番号が見つかった後に資格を確認する処理で設定されます。
Q: 「INVALID KEY」とは何ですか?
A: キーを指定してレコードを読もうとしたとき、そのキーに一致するレコードが見つからない場合に実行される処理です。
A: キーを指定してレコードを読もうとしたとき、そのキーに一致するレコードが見つからない場合に実行される処理です。
関連キーワード: 索引ファイル、キー、READ文、INVALID KEY、結果コード
設問3:
問題文を見る プログラム1によって作成され、保管していた、ある月の入退室ログファイルを読み込み、指定した日時にセキュリティルーム内にいたすべての従業員の従業員番号を表示するプログラム2を作成した。指定した日時より前に入室し、かつ、指定した日時か、それより後に退室したすべての従業員の従業員番号を表示する。プログラム中のに入れる正しい答えを、解答群の中から選べ。

cに関する解答群
ア:LOG-TIME < PRM-TIME
イ:LOG-TIME <= PRM-TIME
ウ:LOG-TIME = PRM-TIME
エ:LOG-TIME > PRM-TIME
オ:LOG-TIME >= PRM-TIME
d〜fに関する解答群
ア:CNT < 99
イ:CNT > 99
ウ:EMP-NO(CNT) = ZERO
エ:LOG-EMP = EMP-NO(CNT)
オ:LOG-EMP = ZERO
カ:LOG-EMP NOT = EMP-NO(CNT)
キ:LOG-EMP NOT = ZERO
ク:SRCH-END
模範解答
c:オ、d:ウ、e:エ、f:イ
解説
解答の導き方
まず、EMP-NO(1)からEMP-NO(99)までの欄が、指定した日時にセキュリティルームにいる従業員を記録するために使われています。配列(同じ形式の値を複数並べて扱う仕組み)の各欄は、最初にZEROで初期化されています。つまり、ZEROなら空き欄、従業員番号が入っていればその従業員が在室中です。
指定日時以降の記録が見つかった時点で、現在の在室者を表示します。
問題文には、ログファイルのレコードは「入退室日時の昇順」に並ぶとあります。そのため、ログを先頭から読むと、指定日時より前の記録が先に処理されます。入室記録なら在室者に加え、退室記録なら在室者から取り除くことで、その時点の在室状況を保てます。
表示に切り替えるのは、指定日時と同じ時刻の記録を処理する前です。小問説明では「指定した日時より前に入室」し、「指定した日時か、それより後に退室」した従業員を表示します。したがって、指定日時と同じ時刻の退室記録はまだ処理せず、その従業員を在室者として残す必要があります。一方、同じ時刻の入室記録も処理しないため、その従業員は表示されません。
この条件に合うのは、LOG-TIMEがPRM-TIME以上かどうかを判定することです。したがって、cはオです。
入室記録では、空いている欄に従業員番号を入れます。
PROC-ENTERでは、CNTを1から順に増やしながら、空き欄を探します。空き欄はEMP-NO(CNT)がZEROの欄です。見つかった欄にLOG-EMPを入れるので、dはウです。
部屋に同時に入れるのは99名までで、配列にも99名分の欄があります。プログラム1が入室記録を作るのは入室が認められた場合なので、有効な入室記録を処理するときには空き欄が見つかります。
退室記録では、その従業員の欄を探して空欄に戻します。
PROC-EXITでは、入室中の従業員の番号とLOG-EMPを照合します。一致する欄が見つかったら、その欄をZEROにして在室者から取り除きます。したがって、繰返しを終了する条件はLOG-EMPとEMP-NO(CNT)が等しいことです。eはエです。
表示時には、99個の欄を最後まで調べます。
PROC-DISPでは、従業員番号がZEROではない欄だけを表示します。CNTは1から始まり、99番目の欄も調べた後に100になります。そこで繰返しを終える条件はCNTが99より大きいことです。したがって、fはイです。
誤りやすいポイント
- cでLOG-TIMEがPRM-TIMEより大きい場合だけを選ぶと、指定日時と同じ時刻の記録を処理してしまいます。指定日時ちょうどの退室者も表示対象にするため、「以上」で判定します。
- 入室者を登録するときは空き欄を探し、退室者を削除するときは本人の従業員番号が入った欄を探します。探す対象を逆にしないように注意してください。
- fでCNTが99に達した時点で終了すると、99番目の欄を調べられません。99番目を調べてから終了するため、条件はCNTが99より大きいことです。
FAQ
Q: なぜ指定日時と同じ時刻の記録を処理しないのですか?
A: 指定日時ちょうどに退室した従業員も、条件では表示対象です。退室記録を処理するとその従業員の番号が消えるため、同じ時刻の記録を処理する前に表示します。
A: 指定日時ちょうどに退室した従業員も、条件では表示対象です。退室記録を処理するとその従業員の番号が消えるため、同じ時刻の記録を処理する前に表示します。
Q: 退室時に、空き欄を探してはいけないのですか?
A: 退室するのは、現在在室している従業員です。その人の従業員番号が入った欄を探し、見つけた欄をZEROにする必要があります。
A: 退室するのは、現在在室している従業員です。その人の従業員番号が入った欄を探し、見つけた欄をZEROにする必要があります。
Q: CNTが99より大きくなった時点で終了するのはなぜですか?
A: 欄は1から99まであります。99番目の欄を調べた後、CNTが100になったところで終了すれば、すべての欄を確認できます。
A: 欄は1から99まであります。99番目の欄を調べた後、CNTが100になったところで終了すれば、すべての欄を確認できます。
関連キーワード: 順ファイル、配列、条件名、繰返し処理、日時比較



