本文へスキップ

技術士試験(情報工学部門)・情報技術者試験。ファーストマクロ。


Since 2016.4.19

平成23年度 技術士第一次試験問題【専門科目】

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行目は
e = 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 によって変形されている。

W−1 目次 W−3