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

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

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

〔プログラムの説明〕

(1) 双六(すごろく)のプログラムである。 双六とは,図のような一本道のコース上に升(ます)あるを,“ふりだし”の位置からスタートして, プレーヤが順番にさいころ2個を振って,出た目の和だけ駒(こま)を進め, 早く“上がり”(ゴール)の位置にたどり着いたプレーヤを勝ちとする遊びである。


   図 双六の例

(2) 双六の進め方は,次のとおりである。

@ プレーヤは“ふりだし”の升に各自の駒を置き,さいころを振る順番を決める。

A 順番にさいころを振って,出た目の和だけ“上がり”方向に駒を進める。

B “上がり”の升に到達すると,そのプレーヤの勝ちとなり,そこでプログラムが終了する。 目の和だけ駒を進めた結果が“上がり”の升を超えた場合も,“上がり”とする。

C 升には順番に番号が割り当てられている。 番号0の升が“ふりだし”であり,番号 23 の升が“上がり”である。

D 升には番号のほかに,到達時の動作指示が割り当てられているものがある。 動作指示には,次の2種類があり,その指示に従う。

(a) 移動の指示: 指示された番号の升に駒を移動する。移動先の升に動作指示 がある場合は,その指示に従う。

(b) 1回休みの指示: 次に順番が回ってきたとき,“さいころを振る番”を1回休む。

(3) プレーヤは,4人とする。

(4) 動作指示は,配列 actype 及び celinf に設定されている。

(5) 次の関数が,あらかじめ定義されているものとする。

@ 関数 dice

機能: 引数で指定されたプレーヤに対してさいころを振る番が来たことを示すメッセージを表示する。 プレーヤが改行キーを入力すると,乱数によって2個のさいころの目の和を決めて, その値を表示し,返却値とする。

呼出し形式: int dice(int playerid);

引数: playerid プレーヤ番号( 0 〜 3 )

返却値: さいころの目の和( 2 〜 12 の整数値)

A 関数 prtpiece

機能: 引数で指定されたプレーヤの駒が現在置かれている升の番号と, 升に割り当てられている動作指示の内容を表示する。

呼出し形式: void prtpiece(int playerid);

引数: playerid プレーヤ番号( 0 〜 3 )

返却値: なし

〔プログラム〕

#include <stdio.h>
#define CELLS   24
#define PLAYERS 4
#define PLAY    1
#define WAIT    0
int dice(int);
void prtpiece(int);
static int actype[CELLS] = { 0, 0, 0, 1, 0, 1, 0, 1, 1, 2, 0, 0,
                             0, 0, 0, 2, 0, 0, 0, 1, 0, 1, 0, 0 };
static int celinf[CELLS] = { 0, 0, 0, 9, 0, 0, 0, 0, 2, 0, 0, 0,
                             0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0 };
static int curpos[PLAYERS], playmode[PLAYERS];
void main()
{
   int gamestatus = 1, playerid;
   printf("双六を開始します。\n");
   for(playerid = 0; playerid < PLAYERS; playerid++){
      curpos[playerid] = 0;
      playmode[playerid] = PLAY;
   }
   playerid = 0;
   while(gamestatus == 1){
      if(playmode[playerid] == PLAY){
         curpos[playerid] += dice(playerid);
         prtpiece(playerid);
         while((curpos[playerid] < CELLS - 1) && ()
               && (playmode[playerid] == PLAY)){
            switch(actype[curpos[playerid]]){
               case  1:   /* 指示先の升へ飛ぶ。 */
                  curpos[playerid] = celinf[curpos[playerid]];
                  prtpiece(playerid);
                  break;
               case  2:   /* 1回休み */
                  playmode[playerid] = WAIT;
                  break;
            }
         }
         if() gamestatus = 0;
      }
      else playmode[playerid] = PLAY;
      if(gamestatus == 1) ;
   }
   printf("プレーヤID:%dの勝ちです。\n", playerid);
}

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

a ,b に関する解答群

ア actype[curpos[playerid]] != 0

イ actype[curpos[playerid]] <= 3

ウ curpos[playerid] == 0

エ curpos[playerid] >= CELLS - 1

オ gamestatus == 0

カ gamestatus == 1

キ playmode[playerid] == PLAY

ク playmode[playerid] == WAIT

c に関する解答群

ア playerid = playerid % PLAYERS + 1

イ playerid = playerid % (PLAYERS + 1)

ウ playerid = (playerid + 1) % PLAYERS

エ playerid += 1

オ playerid += playerid / (PLAYERS - 1)

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

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

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

基本情報技術者試験


設問2 到達時の動作指示として, “続けてさいころを振り,駒を進める”を追加することにした。 そのために switch 文での actype[curpos[playerid]] の値が3のときに,次の処理群を挿入する。 に入れる正しい答えを,解答群の中から選べ。


      case  3:  /* 続けてさいころを振り,駒を進める。 */
         ;
         prtpiece(playerid);
         break;

解答群

ア curpos[playerid] = celinf[curpos[playerid]]

イ curpos[playerid] = celinf[curpos[playerid]] + dice(playerid)

ウ curpos[playerid] += celinf[curpos[playerid] + dice(playerid)]

エ curpos[playerid] += dice(playerid)

オ playmode[playerid] = PLAY

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


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