1や2と答えた人はwhile文がわかっていない。 while文は(for文も)最初に条件判断が行われる。 (つまり一度も本体を実行しないことがある。)
2や4と答えた人は、n--と--nの違いを理解していない。
最も正答率が高かった。(正答 69人)
2や4と間違った人は変数の有効範囲や静的変数 の理解が足りないと思われる。1は論外と言わせてもらう。
正答 54人。
正答 49人。慌てなければ答えられるはず。
P1(p1x, p1y)が S(sx, sy)と C1(x1, y1)の中点、 P2(p2x, p2y)が C1(x1, y1)と C2(x2, y2)の中点、 P3(p3x, p3y)が C2(x2, y2)と E(ex, ey)の中点、 P4(p4x, p4y)が P1とP2の中点、P5(p5x, p5y)が P2とP3の中点、 P6(p6x, p6y)が P4とP5の中点であるので、イが答となる。
この問題は最も正答率が低かった。(正答21人) 再帰的な分割が終了する条件は、
CmpLine( sx, sy, x1, y1, len ) && CmpLine( x1, y1, x2, y2, len ) && CmpLine( x2, y2, ex, ey, len )
ここで、&&は「〜かつ〜」という意味なので、ア・イ・ウのいずれかである。 ここでCmpLineの定義をみると、
int CmpLine( int xs, int ys, int xe, int ye, int len ) { int len1 = xe - xs ; int len2 = ye - ys ; if ( len1 < 0 ) len1 = -len1 ; if ( len2 < 0 ) len2 = -len2 ; if ( ( len1 < len ) && ( len2 < len ) ) return 1 ; return 0 ; }
len1, len2はそれぞれ、x座標, y座標の差なので、下の図のとおり、ウが答となる。
問2の結果から、関数LineToの描く線分は引数lenを1辺とする正方形の中に含まれる。 つまり、おおまかに言って曲線の長さが長いほど、またlenが小さいほど LineToの呼び出しが多くなることになる。 よって答はアとウとなる。
Linesが0のときの曲線は
DrawCurve(50, 160, 128, 160, 256, 160, 384, 160)でこれは一本のまっすぐな線である。ここからLinesが増加するにつれ、 中間の点 C1(cx1, cy1)は右上に C2(cx2, cy2)は左下に移動していく。 結果としてエのような図形を描く。
構造体のメンバにscanfするときの書き方は List 12-10などを参照。
面倒なのでOKにしたが、本来はYagyuとShimazuの間に空行が2つ必要である。
学生の数が23人などと決め打ちにしている解答が多かったが、 100人以下の任意の人数に対応しなければならない。 (fscanfの戻り値を使って、 ファイル中にデータがなくなった時点でループを終了する。)
ソートするところまでは、例題を参考にすればできるはず。
解答を提出したのは1人だけだった。