平成23年度 技術士第一次試験問題【専門科目】
【16】情報工学部門
W−2
整定数の座標で与えられた画素 (dx, dy) (ただし、0 < dx, 0 ≦ dy/dx ≦ 1)
に向かって原点から伸びる線分を表す連結画素列を、関数 plot_pointを用いて順に
出力するC言語のプログラムの一部を以下に示す。
ただし、各行左端の数字は行番号でありプログラムには含まれない。

  1 int x, y; float e;
  2 e = (float)dy / (float)dx;
  3 y = 0;
  4 for (x = 0; x < dx; x++) {
  5  plot_point(x, y);
  6  if (e >= 0.5) {
  7   y++; e = e - 1.0;
  8  }
  9  e = e + (float)dy / (float)dx;
 10 }
 11 plot_point (dx, dy);

このプログラムの中で、変数 e が現れる2、6、7、9 行目では、浮動小数点数計算
が必要であり、実行速度が低下してしまう。そこで、新たに int 型の変数 f を導入し
 f = 2.0 * dx * (e - 0.5)
という変数変換を施せば、浮動小数点数 e の代わりに整数 f を更新するように、
このプログラムを書き直すことができる。例えば、2行目は
 f = 2 * dy - dx
となる。同様にして6行目を書き直したものはどれか。

 @ if (f >= dx) {
 A if (f <= 2*dx) {
 B if (f >= 2*dx) {
 C if (f <= 0) {
 D if (f >= 0) {



【正解】 D
f = 2.0 * dx * (e - 0.5) を変形すると
e - 0.5 = f / (2.0 * dx)
e = f / (2.0 * dx) + 0.5 となる。

6行目に代入すると
e = f / (2.0 * dx) + 0.5 >= 0.5
f / (2.0 * dx) >= 0
dx > 0 であるため、  f >= 0 となる。

ちなみに2行目は
f / (2.0 * dx) + 0.5 = dy / dx
f / (2.0 * dx) = dy / dx - 0.5
f = (dy / dx -0.5) * (2.0 * dx)
f = (dy / dx) * (2.0 * dx) - 0.5 * (2.0 * dx)
f = 2 * dy -dx によって変形されている。


EXCELのマクロのご相談なら ファーストマクロ 



W−1 目次 W−3
ファーストマクロ TOPページ