2016年11月30日水曜日

[平成28年度春] 午後 問8 解説

[問題文・解答]


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

[問題概要]


この問題は、必須問題です。
出題分野はデータ構造及びアルゴリズムで、問題の題材は簡易メモ帳のメモリ管理です。
メモ帳アプリの編集処理やメモリ管理を行うプログラムについて問われます。専門知識はさほど必要ありませんが、問題文中の配列処理をよく理解する必要があります。

[設問1]

a) メモを1件追加する関数addMemoの処理の流れは、以下の通りです。
①textをData[]に格納する位置の情報をMemo[]の最初の空き要素に設定
②MemoCntに1加算
③長さtextLenの文字列textをData[]の最初の空き要素以降に格納
④DataLenにtextLenを加算
addMemoの1行目:Memo[MemoCnt]←aの部分は処理①にあたるため、aには追加メモの文字列textを格納するData[]中の位置(Index)が当てはまります。
DataLenがData[]に格納されている文字数なので、textを格納するData[]の最初の空き要素の位置(Index)はData[DataLen]となります。(※配列Data[]は0-origin)
従って、「ア」が正解となります。

b) 関数addMemoの最後の行:DataLen←bの部分は、上記解説の処理④にあたるため、bには「ウ」のDataLen+textLenが当てはまります。

c) 1件のメモを削除する関数deleteMemoの処理の流れは、以下の通りです。
①配列Memo[]中のpos+1番目から最後の要素であるMemoCnt-1番目までの要素を1つ前にずらす
②MemoCntを1減ずる
関数中の1行目から4行目の処理が処理①にあたります。具体的なプログラムとしてはiにcを代入後、iがcからMemoCnt-1になるまで1ずつ加算しながらMemo[i-1]←Memo[i]の処理を繰り返し行っています。よって、処理①の説明よりcにはpos+1が当てはまるため「エ」が正解です。

d) 1件のメモを移動する関数moveMemoの処理の流れは、以下の通りです。
①変数mに移動するメモのData[]中での格納位置(Memo[fromPos]の値)を一時格納
②-1 fromPos < toPosの場合は、Memo[]のfromPos+1〜toPos番目の要素を前方に1要素分ずらす。
②-2 fromPos > toPosの場合は、Memo[]のtoPos〜fromPos-1番目の要素を後方に1要素分ずらす。
※fromPos = toPosの場合は、実質移動なしのため、配列をずらす処理は不要。
③mに格納しておいた値をMemo[toPos]に格納
moveMemoの5〜7行目が処理②-2に当たります。従って、iをfromPos〜toPos+1に1ずつ減らしながら、Memo[i-1]の値をMemo[i]にずらしていくためdには
fromPos, i ≧ toPos + 1, -1
が当てはまるため「イ」が正解です。

[答] a) ア b) ウ c) エ d) イ

[設問2]


e,f) 関数clearGarbageでは、Memo[]の最初の要素から順に参照していき、Data[]中に格納されている文字列をtemp[]に格納するとともにその格納位置をMemo[]の新しい値として更新します。そして、最後にtemp[]の値をData[]にコピーすることでData[]を不要な要素の削除された状態にします。つまり、メモの順序自体は変わらずData[]中の格納順序がメモの順序に合わせたものに更新されます。
従って、clearGarbage実行後はData[]及びMemo[]は以下の状態になります。
Memo[]:0 4 9 以降空き
Data[]:3 A b e 4 I m a i 3 I n o 以降空き
以上より、Memo[1]は4、Memo[2]は9となります。

g) clearGarbage実行後のData[]は上記のようになり、DataLenもそれに合わせて更新されるため、「ケ」の13が正解です。

[答] e) ウ f) カ g) ケ

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


0 件のコメント:

コメントを投稿