基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成18年 春期 基本情報技術者 午後 問06
問06   C言語

次の C プログラムの説明及びプログラムを読んで,設問1,2 に答えよ。

〔プログラムの説明〕

Helge von Koch が考案したコッホ曲線と呼ばれるフラクタル図形を描画する関数 KochCurve である。 フラクタル図形は,図形の一部を拡大すると,再び,同様の 図形が現れる自己相似性をもち,コッホ曲線はその代表的な図形である。

(1) 図1の @ 〜 B にコッホ曲線の生成手順を示す。

  図 1 コッホ曲線の生成手順

@ 始点の座標を(x1,y1),終点を(x2,y2)とする 2 点を結ぶ線分を引く。

A 線分を 3 等分し,中央の線分を一辺とする正三角形を始点から終点に向かって左側に作り, その頂点座標を求める。 始点(x1,y1)から,正三角形の 3 頂点 (x3,y3),(x4,y4),(x5,y5),そして終点(x2,y2)を順番に結んだ四つの線分を引く。

B 得られた四つの線分それぞれを @ の線分とみなし,A の操作を行う。

この操作を繰り返して得られるのがコッホ曲線である。

(2) 関数 DrawLine は,引数で指定された 2 点を結ぶ線分を描画する関数であり,既に用意されている。 関数の仕様は,次のとおりである。

呼出し形式:

  void DrawLine( int x1, int y1, int x2, int y2 );

引数: x1 及び y1 線分の始点座標(x1,y1)    x2 及び y2 線分の終点座標(x2,y2)

返却値: なし

(3) 関数 KochCurve は,引数で指定された 2 点(始点及び終点)の座標を 基点にしてコッホ曲線を描画する関数であり,仕様は次のとおりである。

呼出し形式:

  void KochCurve( int x1, int y1, int x2, int y2, int dim );

引数: x1 及び y1 コッホ曲線の始点座標(x1,y1)

x2 及び y2 コッホ曲線の終点座標(x2,y2)

dim (1) の説明での繰返し回数

0 のとき図1の @ が描画される。

返却値: なし

(4) このプログラムを実行すると,図1の A に示すような図形が描画される。 また,行番号 25 を次のとおりに変更して実行すると,B に示すような図形が描画される。

  25   KochCurve( 0, 180, 180, 180, 2 );

なお,座標軸は,原点(0,0)から,右向きを x 軸の正方向,下向きを y 軸の正方向とする。

〔プログラム〕
(行番号)
 1  #include <stdio.h>
 2  #include <math.h> 
 3  #define PI 3.141593
 4  void DrawLine( int, int, int, int );
 5  void KochCurve( int x1, int y1, int x2, int y2, int dim )
 6  {
 7      int x3, y3, x4, y4, x5, y5;
 8      if (  ) 
 9          DrawLine( x1, y1, x2, y2 );
10      else {
11          x3 = ( 2 * x1 + x2 ) / 3;
12          y3 = ( 2 * y1 + y2 ) / 3;
13          x5 = ( x1 + 2 * x2 ) / 3;
14          y5 = ( y1 + 2 * y2 ) / 3;
15          x4 = x3 + (x5 - x3) * cos(PI/3) + (y5 - y3) * sin(PI/3);
16          y4 = y3 - (x5 - x3) * sin(PI/3) + (y5 - y3) * cos(PI/3);
17          KochCurve( x1, y1, x3, y3,  );
18          KochCurve( x3, y3, x4, y4,  );
19          KochCurve( x4, y4, x5, y5,  );
20          KochCurve( x5, y5, x2, y2,  );
21      }
22  }
23  void main()
24  {
25      KochCurve( 0, 180, 180, 180, 1 );
26  }

設問1 プログラム中の に入れる正しい答えを, 解答群の中から選べ。

a に関する解答群

ア dim <= 0      イ dim <= 1      ウ dim == 1

エ dim != 0       オ dim != 1

b に関する解答群

ア dim--       イ dim - 1      ウ dim

エ dim + 1      オ dim++

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

基本情報技術者試験


設問2 図2の図形を描画するためには,関数 main の行番号 25 をどのように変更 すればよいか。正しい答えを,解答群の中から選べ。

  図2 描画したい図形

解答群

ア KochCurve(  0,  0,  0, 180, 2 );

  KochCurve(  0, 180, 180, 180, 2 );

  KochCurve( 180, 180, 180,  0, 2 );

  KochCurve( 180,  0,  0,  0, 2 );

イ KochCurve(  0,  0, 180,  0, 2 );

  KochCurve( 180,  0, 180, 180, 2 );

  KochCurve( 180, 180,  0, 180, 2 );

  KochCurve(  0,  0,  0, 180, 2 );

ウ KochCurve(  0,  0, 180,  0, 2 );

  KochCurve( 180,  0, 180, 180, 2 );

  KochCurve( 180, 180,  0, 180, 2 );

  KochCurve(  0, 180,  0,  0, 2 );

エ KochCurve(  0,  0, 180,  0, 2 );

  KochCurve( 180,  0, 180, 180, 2 );

  KochCurve(  0,  0,  0, 180, 2 );

  KochCurve(  0, 180, 180, 180, 2 );

オ KochCurve( 180,  0, 180, 180, 2 );

  KochCurve( 180, 180,  0, 180, 2 );

  KochCurve(  0, 180,  0,  0, 2 );

  KochCurve(  0,  0, 180,  0, 2 );

解答 ←クリックすると正解が表示されます

[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]