2016年12月11日日曜日

[平成27年度秋] 午後 問9 解説

[問題文・解答]


平成27年度10月に実施された基本情報技術者試験の午後試験の問題・解答はIPA公式ページからダウンロード出来ます。(以下リンク)

[問題概要]


この問題は、選択問題で問9〜問13のうち1問を選択する必要があります。
出題分野はソフトウェア開発(C)で、問題の題材は入退室状況の印字です。
制限エリアへの入退室ログファイルを読み込んで、入退室状況の表示や入退室順序の整合性チェックを行うプログラムについて問われます。C言語の基礎知識が必要で、問題文及びプログラムの内容をよく理解しないと解答が難しい問題です。

[設問1]


a) 関数getRecord()は、入退室ログファイルから1行読み込んで、各種情報を文字列変数に格納します。aにはログファイルの最後まで到達した場合の処理が入ります。getRecord()実施後には必ずwhile( logEOF != EOF )が実行されており、logEOFの値がEOFとなっているかどうかで、whileループを抜けるかどうか判断しています。従って、aに入る処理は logEOF = EOF となるため「エ」が正解です。

b) 関数putRecord()では、まずif (strcmp (cardID, lastID) == 0 )によって同一カードIDが続くかどうかを判断し、続く場合はスペース18個を印字します。またカードIDが変わる場合は新しいカードID及び名前を印字した後、bの処理を行います。bでは、lastIDの値をcardIDで上書きするため、strcpy(lastID, cardID)が当てはまります。よって「ク」が正解です。

c) 行⑦の直後〜行⑧までの処理では、入退室しているドアのレベルに応じて以下のようにスペースを印字します。
レベル1:スペース0個
レベル2:スペース20個
レベル3:スペース40個
ドアのレベルはP.40中段の記述より、ドア番号は10の位がレベルを表すためcには、door[0] - '0' - 1が当てはまります。よって「ア」が正解です。

[答] a) エ b) ク c) ア

[設問2]


d) 関数checkLevel()は、一行前のログで更新されたドア通過後のレベルと現在のログから想定されるドア通過前のレベルが異なる場合に不整合を表すメッセージを印字します。この関数を実行すべきタイミングはログファイルから新しい行を読み込んで、カードID及び名前(カードIDが変わらない場合はスペース18個)を印字した直後なので、行⑦の直後が適切です。よって「オ」が正解です。

e) 関数clearLevel()は、入室者が最後にレベル0つまり制限エリアの外に退室していない場合に不整合メッセージを印字する関数です。この関数を実行すべきタイミングはgetRecord()によりログファイルから新しい行を読み込んだ直後つまり行④の直後なので「イ」が正解です。。

f,g) f,gの部分は不整合時にメッセージを印字する部分であり、 ログ中に本来あるべき記録が残っていない入退室を印字します。
プログラム中のlevelには一行前のログでドア通過後にいると想定されるレベル、beforelevelには現在のログでドア通過前にいると想定されるレベルが格納されています。本来はlevelとbeforeleveは一致すべきですが、不一致の場合にlevel→beforelevelの入退室記録が無いことを印字します。従って、fには「エ」のlevelが、gには「イ」のbeforelevelが当てはまります。

[答] d) オ e) イ f) エ g) イ

上記の解説は問題と解答を元に自分なりの考え方を記述しており、間違っている部分もあるかと思いますので、ご了承願います。また、誤りについては正しい考え方をご指摘・ご教授頂けると助かります。


0 件のコメント:

コメントを投稿