応用情報技術者過去問題 平成23年秋期 午後問2

⇄問題文と設問を画面2分割で開く⇱問題PDF⇱解答用紙PDF

問2 プログラミング

ハッシュ法と排他制御に関する次の記述を読んで,設問1〜3に答えよ。

 T社は,ソフトウェア開発を行う会社である。現在,LAN環境で利用するクライアントサーバシステム(以下,本システムという)を開発中である。
 本システムは,クライアントPC上で画面にデータを表示する画面プログラムと,画面プログラムが使用するデータをサーバ上で管理するデータ管理プログラムから構成される。

〔データ構造〕
 配列 array は,クライアントPCで使用するデータ info を格納する配列であり,配列の添え字は1〜Nである。info のデータ型は構造体 INFO である。表1に構造体 INFO のメンバを示す。構造体メンバの初期値は,全て 0 (未使用を意味する)を設定する。
pm02_1.gif/image-size:478×97
 ハッシュ関数 Hash(key) は,key を基にデータの格納位置を算出して,戻り値として戻す。格納位置は1〜Nの整数となる。関数 Hash(key) が,異なる key から同じ格納位置を算出することを,シノニムの発生という。この影響で,格納位置の配列要素が既に使用されていて,データを格納できないことがある。この場合は,配列 array を格納位置の次から順次検索し,最初に見つかった未使用の配列要素にデータを格納する。配列 array の最後に到達しても未使用の配列要素がない場合には,配列 array の先頭に戻り,未使用の配列要素の検索を続ける。

〔データ管理プログラム〕
 図1のデータ格納関数 Set(),図2のデータ取得関数 Get(),図3のデータ削除関数 Delete() をデータ管理プログラムと呼ぶ。
 関数Get()は,データ取得に成功すると,取得したデータを引数 info に格納する。関数 Set() と関数 Get() は戻り値として格納位置を戻す。処理結果が正しくない場合は,戻り値として 0 を戻す。
pm02_2.gif/image-size:528×862
〔画面プログラム〕
 ユーザは,画面プログラムを使用して,info の作成,検索,編集,削除を行う。
 画面プログラムから配列 array へのアクセスにはデータ管理プログラムを使用する。
 複数のクライアントPCから同時に配列 array にアクセスできるので,画面プログラムから配列 array へのアクセスには排他制御が必要である。そこで,バイナリセマフォの確保関数 Lock(),解放関数 Unlock() を使用した占有ロックを用いて排他制御を実現する。
 図4は画面プログラムの一部である。ユーザが画面から入力した key と data が配列 array 内に存在しない場合は,データを配列 array に格納している。
pm02_3.gif/image-size:524×197
 コーディングを完了したプログラムのテストを実施したところ,次のような障害が発生した。
 ①あるデータを削除すると,別のデータの取得に失敗した。削除するデータと取得できなくなるデータには関連があり,再現方法は容易に分かった。プログラムを修正して障害は解決した。
 ②複数のクライアントPCから図4の画面プログラムの操作を同時に行った場合に,同じ key をもつデータが重複して配列 array に格納されてしまった。この障害は,再現頻度が低く,原因究明に時間が掛かった。この障害についてもプログラムを修正して障害は解決した。

設問1

図1及び図2中のに入れる適切な字句を答えよ。

-解答入力欄-

  • ア:
  • イ:
  • ウ:
  • エ:

-解答例・解答の要点-

  • ア:countはNより小さい
  • イ:idxはNより大きい
  • ウ:Hash(key)
  • エ:array[idx].keyはkeyと等しくない

-解説-

この設問の解説はまだありません。

設問2

本文中の下線①の障害について,(1),(2)に答えよ。
  • 障害の原因を40字以内で述べよ。
  • データ管理プログラムの修正の組合せとして適切な文章を解答群の中から二つ選び,記号で答えよ。
解答群
  • 関数 Delete()中の"array[idx].key←0"の 0 を −1 に変更する。
  • 関数 Get()中のif文の条件"array[idx].key は key と等しい"を削除して,無条件にデータを取得する。
  • 関数 Get()中のwhile文の条件"(array[idx].key は 1 以上)かつ(array[idx].key は 999999999 以下)"を"(array[idx].key は 0 以外)"に変更する。
  • 関数 Set()中でオーバフローを検出した場合は,配列 array を動的に拡張してデータを格納する。
  • 関数 Set()中のif文の条件"countはNより小さい"を削除して,無条件にデータを格納する。
  • 関数 Set()中のwhile文の条件"array[idx].key は 1 以上"を削除する。

-解答入力欄-


-解答例・解答の要点-

    • シノニムの発生を考慮せずに配列要素を削除するから (24文字)

-解説-

この設問の解説はまだありません。

設問3

本文中の下線②の障害について,原因を25字以内で述べよ。

-解答入力欄-


-解答例・解答の要点-

  • データの取得後に排他制御を開始するから (19文字)

-解説-

この設問の解説はまだありません。
問2成績

平成23年秋期 午後問題一覧

問1 問2 問3 問4 問5 問6 問7 問8 問9 問10 問11 問12 採点講評
© 2010-2021 応用情報技術者試験ドットコム All Rights Reserved.

Pagetop