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

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

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

〔プログラムの説明〕

 コンサート会場において,連続して確保したい席数を与えられると, 座席を決定し,結果を返却値として返すプログラムである。

(1) コンサート会場の座席は,図に示すとおりである。

図 コンサート会場の座席配置

@ 座席は,A 〜 Z の 26 列からなり,列によって座席数が異なる。 各列の座席数は,列 A 〜 Z の順に大域の配列 cnum に格納されている。

A 座席番号は,列と番からなる。 番とは,各列についてステージに向かって左から何番目の座席であるかを 示す番号のことである。 例えば,“L 列 6 番”の座席とは,ステージから 12 列目(L 列)のステージに 向かって左から 6 番目の座席を指す。

B 図の網掛けの席は,予約済である。

(2) 連続して確保したい希望席数を,引数 number に格納してプログラムに渡す。

(3) 座席は,ステージに向かって最前列左端(A 列1番)から, 同一列に希望席数の入る連続した空きがあるかどうかを調べ,最初に 見つかった空きを確保する。 A列で確保できなかった場合は,順次 B 列,C 列,… と後列に対して左端から, 希望席数の入る連続した空きがあるかを調べ,最初に見つかった空きを確保する。 全席探しても空きが見つからなかった場合には,座席が確保できなかったものとする。

(4) 希望数の座席が確保できた場合は,その座席の列名と,確保できた座席の中で, ステージに向かって最も左端に位置する座席の番号とを格納した座席番号構造体 (SEAT)へのポインタを,返却値として返す。 確保できなかった場合は,空ポインタ(NULL)を返却値として返す。

(5) 構造体 SEAT の宣言は,次のとおりである。


typedef struct {
    char    row;        /* 座席の列名 */
    int     no;         /* 座席の番号 */
} SEAT;

(6) コンサート会場の各座席の状況は,大域変数 status に格納されている。 座席が確保できた場合には,確保できた座席を予約済にする。

  

列 A 〜 Z に対応する添字 i の値は 0 〜 25 になる。 番 1 〜 n に対応する添字 j の値は 0 〜 n − 1 になる。

〔プログラム〕

#define MAXNUM 30     /* 列の最大座席数 */
#define ROWNUM 26     /* 列数 */
typedef struct {
    char    row;      /* 座席の列名 */
    int     no;       /* 座席の番号 */
} SEAT;
static char rname[] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZ"}, 
            status[ROWNUM][MAXNUM];
static int  cnum[ROWNUM] = {12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 30, 30, 30, 30,
                            30, 30, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12};
static SEAT empty;
SEAT *book_seat(int);
SEAT *book_seat(int number)
{
    int ridx, cidx, eidx, flg = 0;
    for (ridx = 0; ridx < ROWNUM; ridx++) {    
        for (cidx = 0; cidx <= cnum[ridx] - number; cidx++) {
            if (status[ridx][cidx] == ' ') {
                ;
                for (eidx = ; cidx < eidx; eidx--)
                    if (status[ridx][eidx] == 'R') {
                        flg = 0;
                        break;
                    }
                if (flg == 1) break;
            }
        }
        if (flg == 1) break;
    }
    if (flg == 0)
        return NULL;
    for (eidx = cidx + number - 1; cidx <= eidx; eidx--)
        status[ridx][eidx] = 'R';
    empty.row = ;
    empty.no  = ;
    return &empty;
}

基本情報技術者試験


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

a に関する解答群

ア cidx++       イ cidx--

ウ cidx += number   エ cidx += number - 1

オ flg = 0       カ flg = 1

b に関する解答群

ア 0           イ cidx

ウ cidx + 1       エ cidx + number

オ cidx + number - 1   カ number

キ number - 1

c に関する解答群

ア ridx        イ ridx + 1

ウ ridx - 1      エ rname[ridx]

オ rname[ridx + 1]   カ rname[ridx - 1]

d に関する解答群

ア cidx        イ cidx + 1    ウ cidx - 1

エ ridx + cidx    オ ridx - cidx

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

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

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

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


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