2016年12月1日木曜日

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

[問題文・解答]


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

[問題概要]


この問題は、選択問題で問9〜問13のうち1問を選択する必要があります。
出題分野はソフトウェア開発(C)で、問題の題材はフラクタル図形の描画です。
フラクタル図形描画プログラムの動作や処理内容について問われます。配列の理解と数学的センスの問われる難易度の高い問題です。

[設問1]


print_fracでは、深さd-1の図形を構成する各文字が"*"ならば予め設定した生成パターンに置き換え、空白文字ならば生成パターンと同サイズの空白文字の行列に置き換えて深さdの図形を生成します。つまり、深さdの図形は深さd-1を拡大して"*"の部分を生成パターンで、空白文字の部分を空白行列に置き換えた図形となります。深さ2の図形をそのまま拡大すると斜線部の"*"は③に相当する部分に来ます。これが生成パターンに置き換えられているため、③が正解です。

[答] ウ

[設問2]


print_fracで生成された図形では深さ0では1文字の"*"のため、以降深さを深くしていく際に生成パターンpatに置き換えられます。この最初の1文字から置換されている部分は図形全体の対称の中心に位置するため、設問2の図形では中央上の部分に相当します。また、図形全体の縦横比が1:1で無いことから生成パターンも縦横比が1:1で無いことが分かります。よって、「イ」が適切です。

[答] イ

[設問3]


a) p_rn及びp_cnはそれぞれ生成パターンの行数(縦の長さ)、列数(横の長さ)を示します。深さ0では1文字のため、1×1の図形です。深さ1ではその1文字が生成パターンに置換されるため縦p_rn、横p_cnの図形になります。深さ2では深さ1の図形(生成パターン)の各文字が縦p_rn、横p_cnの図形に置換されるため、全体としては縦p_rn^2、横p_cn^2の図形となります。同様に求めていくと深さdの図形は、縦p_rn^d、横p_cn^2の図形となります。
aのあるfor文では、生成される深さdの図形の縦横の長さをそれぞれ求めてrn、cnに代入する処理を行っているため、aには「エ」の
rn*=p_rn;
cn*=p_cn;
が当てはまります。

b) 関数exists_atの処理で深さd=0の時は、必ず"*"となるため1を返します。よって、「イ」が正解です。

c) exists_at(i / p_rn, j / p_cn, d-1) == 0 の部分では、深さの1つ浅い図形(d-1)で置換元となっている部分が空白文字かどうかを判別しています。深さd-1の段階で空白文字の場合は、置換後全て空白文字の行列で置き換えられるため、深さdの図形の(i,j)の部分も空白文字となり、exists_atは0を返します。よって、「ア」が正解です。

d) 深さd-1の段階の置換元の文字が"*"の場合は、生成パターンで置換されるため深さdの図形において(i,j)の要素が生成パターンのどの部分に相当するかによって返り値が0か1か変わってきます。生成パターンのどの部分に相当するかは、i及びjをそれぞれp_rn及びp_cnで割った剰余から分かるため「カ」が正解です。

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

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


0 件のコメント:

コメントを投稿