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

平成16年 秋期 基本情報技術者 午後 問10
問10   C言語

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

〔プログラムの説明〕

画面上に表示されるマーカを操作することによって,線画を描く関数 execute である。

(1) 水平方向に 800 画素,垂直方向に 600 画素からなるビットマップ画面がある。 画面の座標系を図1に示す。 画面上には,位置と進行方向の情報をもつマーカ(図1中の) が表示されている。 マーカの進行方向は,上,下,左,右の4通りのいずれかである。 マーカが移動すると,その軌跡が描画される。

     図1 画面の座標系とマーカの初期状態

(2) マーカは MARKER 型の構造体 mark で表現する。 プログラムの実行開始時には,マーカの位置は( 400,300 ),進行方向は上に設定される。

typedef struct {

int x; /* マーカの x 座標 */

int y; /* マーカの y 座標 */

int dir; /* マーカの進行方向 0:右 1:上 2:左 3:下 */

} MARKER;

MARKER mark = {400, /* マーカの初期の x 座標 */

300, /* マーカの初期の y 座標 */

1 /* マーカの初期の進行方向(上)  */

};

(3) マーカを操作するための命令が定義されている。 命令は,命令コードと値から構成され,構造体 INST で表現する。

typedef struct {

char code; /* 命令コード */

int val; /* 値     */

} INST;

命令は,構造体 INST の配列である insts の先頭から実行する順番に格納しておく。

(4) 命令コードとその説明を次に示す。

命令コード 説明
{ 次の命令から対となる命令コード '}' の直前の命令までを
val 回繰り返す。val は 1 以上の整数値である。
t マーカの進行方向を反時計回りに 90°× val だけ変更する。
val は非負の整数値である。
f 現在の進行方向にマーカを val 画素分だけ進め,移動元から
移動先まで線分を描く。val は任意の整数値である。
} 繰り返す一連の命令の終了を示す。val は参照しない。
\0 命令列の終了を示す。val は参照しない。

(5) 例えば,図2のように構造体配列 insts に命令を格納して, 関数 execute を実行した場合の出力は図3のとおりである。 ただし,図3中の座標値は説明のために添えたものであり,実際は出力されない。

   図2 構造体配列 insts に格納されている命令の例

   図3 図2の例の実行結果

(6) 線分を描くために次の関数が用意されている。

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

機能:座標( x1,y1 )と座標( x2,y2 )を結ぶ線分のうち,画面領域に含まれる部分を描画する。

(7) マーカに関する次の関数が用意されている。

void eraseMarker( MARKER mark );

機能:マーカが画面領域内にあるとき,マーカの表示を消去する。

void paintMarker( MARKER mark );

機能:マーカが画面領域内にあるとき,マーカを描画する。

(8) マーカが画面領域外に移動し画面上に表示されなくても,その位置座標及び進行方向の情報は保持される。

基本情報技術者試験


〔プログラム〕

#define INSTSIZE 100  /* 命令数の上限     */
#define STACKSIZE 50  /* {}の入れ子の上限  */
typedef struct {
    int x;    /* マーカの x 座標 */
    int y;    /* マーカの y 座標 */
    int dir;  /* マーカの進行方向 0:右 1:上 2:左 3:下 */
} MARKER;
typedef struct {
    char code; /* 命令コード */
    int  val;  /* 値     */
} INST;
typedef struct {
    int opno; /* 繰返しの開始が定義されている配列 insts の要素番号   */
    int rest; /* 繰返しの残り回数                       */
} STACK;
void drawLine( int, int, int, int );
void eraseMarker( MARKER );
void paintMarker( MARKER );
INST insts[INSTSIZE]; /* 命令を格納するための構造体配列   */
MARKER mark  = {400,  /* マーカの初期の x 座標          */
                300,  /* マーカの初期の y 座標          */
                  1   /* マーカの初期の進行方向(上)    */
               };
void execute(){
    STACK stack[STACKSIZE]; 
    int opno = 0; /* 実行する命令の配列 insts の要素番号  */
    int spt = -1; /* スタックポインタ                 */
    int dx, dy;
    paintMarker( mark );
    while( insts[opno].code != '\0' ){
        switch( insts[opno].code ){
            case '{':
                  stack[].opno = opno;
                  stack[spt].rest = insts[opno].val;
                  break;
            case 't': 
                  mark.dir = ;
                  break;
            case 'f': 
                  eraseMarker( mark );
                  dx = ( mark.dir % 2 == 0 ) ? ;
                  dy = ( mark.dir % 2 == 0 ) ? ;
                  drawLine( mark.x, mark.y, 
                            mark.x + dx, mark.y + dy );
                  mark.x += dx;
                  mark.y += dy;
                  paintMarker( mark );
                  break;
            case '}':
                  if ( stack[spt].rest  ){
                      opno = stack[spt].opno;
                      stack[spt].rest--;
                  } else {
                      ;
                  }
                  break;
        }
        ;
    }
}

基本情報技術者試験


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

a に関する解答群

ア ++spt    イ --spt    ウ spt

エ spt++    オ spt--

b に関する解答群

ア ( mark.dir + insts[opno].val ) % 2

イ ( mark.dir + insts[opno].val ) % 3

ウ ( mark.dir + insts[opno].val ) % 4

エ mark.dir + insts[opno].val

オ mark.dir + insts[opno].val % 2

カ mark.dir + insts[opno].val % 3

キ mark.dir + insts[opno].val % 4

c,d に関する解答群

ア ( 1 - mark.dir ) * insts[opno].val : 0

イ ( 2 - mark.dir ) * insts[opno].val : 0

ウ ( mark.dir - 1 ) * insts[opno].val : 0

エ ( mark.dir - 2 ) * insts[opno].val : 0

オ 0 : ( 1 - mark.dir ) * insts[opno].val

カ 0 : ( 2 - mark.dir ) * insts[opno].val

キ 0 : ( mark.dir - 1 ) * insts[opno].val

ク 0 : ( mark.dir - 2 ) * insts[opno].val

ケ 0 : mark.dir * insts[opno].val

コ mark.dir * insts[opno].val : 0

e に関する解答群

ア < 0    イ < 1    ウ == 0

エ > 0    オ > 1 

f,g に関する解答群

ア mark.dir++    イ mark.dir--    ウ opno++

エ opno--      オ spt++       カ spt--

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

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

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

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

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

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

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


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