一、単一選択問題
1-1 配列 int a[2][3]; が宣言されているとき、a の要素への正しいアクセス方法は?
- A.
a[0][1+1] - B.
a[1][3] - C.
a[1,3] - D.
a(1)(1)
1-2 関数オーバーロードに関する正しい記述は?
- A. オーバーロード関数の名前は異なってもよい
- B. 引数の個数が必ず異なる必要がある
- C. 戻り値の型が異なっていなければならない
- D. 引数リストが異なっていなければならない
1-3 次のコードの実行結果として正しいのは?
int CY = -1;
do {
CY = CY * CY;
} while (!CY);
- A. ループは1回だけ実行される
- B. ループは2回実行される
- C. 無限ループになる
- D. 文法エラーがある
1-4 char XZ[] = "ChangYou"; と定義されたとき、配列 XZ が占めるメモリサイズは?
- A. 6バイト
- B. 7バイト
- C. 8バイト
- D. 9バイト
1-5 二次元配列 a の要素 a[i][j] をポインタでアクセスする正しい方法は?
- A.
*(a+i+j) - B.
*(*(a+i)+j) - C.
*(a+i)+j - D.
*a+i+j
1-6 次のコードをビッグエンディアン環境で実行したときの出力は?
union MyUnion {
int a;
short b;
};
int main() {
MyUnion value;
value.a = 3;
printf("%d", value.b & 1);
}
- A. 3
- B. 1
- C. 2
- D. 0
1-7 次のコードの出力は?
int main() {
int a = 10;
int* b = &a;
*b = 0;
std::cout << a;
}
- A. 0
- B. 10
- C. 不確定
- D. 上記以外
1-8 次のコードの出力は?
class A {
public:
A() { num++; }
virtual void print() { std::cout << num; }
private:
int num = 0;
};
class B : public A {
public:
virtual void print() { std::cout << num; }
private:
int num = 0;
};
int main() {
A* a = new B();
a->print();
}
- A. 0
- B. 1
- C. 3
- D. 4
1-9 次のコードの出力は?
int main() {
int i = 0, x = 0;
do {
if (i % 5 == 0) {
std::cout << x;
x++;
}
++i;
} while (i < 10);
std::cout << x;
}
- A. 01
- B. 02
- C. 012
- D. 011
1-10 次のコードの出力は?
class A {
public:
virtual void a() = 0;
A() { std::cout << "A "; }
};
class B : public A {
public:
B() { std::cout << "B "; }
};
int main() {
A* a = new B();
}
- A. A B
- B. B A
- C. コンパイルエラー
- D. 上記以外
1-11 64ビットシステムにおいて、次のコードの出力は?
class No {
public:
virtual void printf() = 0;
private:
int* ptr;
};
int main() {
printf("%d", (int)sizeof(No));
}
- A. 1
- B. 4
- C. 8
- D. 16
1-12 仮想記憶の基礎となる局所性原理の意味は?
- A. コードが順次実行されること
- B. 実行時にメモリへのアクセスが不均等であること
- C. 変数が連続してアクセスされること
- D. 命令の局所性
1-13 m 個のプロセスが共有する臨界資源をセマフォで保護するとき、セマフォの値の範囲は?
- A. 1 から 1−m
- B. 1 から m−1
- C. 1 から −m
- D. 1 から m
1-14 通常、プロセス制御ブロック(PCB)に含まれない情報は?
- A. プロセス識別子
- B. プロセス状態
- C. I/Oデバイス状態
- D. プロセッサ状態
1-15 動的リンクに適したメモリ管理方式は?
- A. セグメンテーション
- B. ページング
- C. 可変パーティション
- D. 固定パーティション
1-16 LRUアルゴリズムでページ置換を行うとき、ページ参照列 0,1,2,7,0,5,3,5,0,2,7,6 における置換回数は?(割当フレーム数:4)
- A. 3
- B. 4
- C. 5
- D. 6
1-17 次の操作のうち、キューを補助記憶として必要とするのは?
- A. ハッシュテーブル検索
- B. グラフの幅優先探索
- C. 二分木の先行順走査
- D. グラフの深さ優先探索
1-18 ヒープの構造はどのような木か?
- A. 完全二分木
- B. 満二分木
- C. 二分探索木
- D. 平衡二分木
1-19 赤黒木を内部実装に用いているSTLコンテナは?
- A. vector
- B. list
- C. map
- D. deque
1-20 要素数 n のハッシュテーブルにおける平均検索長は?
- A. O(logn)
- B. O(n)
- C. O(n logn)
- D. n に直接依存しない
1-21 クイックソートの2パス目の結果としてあり得ないのは?
- A. 5,2,16,12,28,60,32,72
- B. 2,16,5,28,12,60,32,72
- C. 2,12,16,5,28,32,72,60
- D. 5,2,12,28,16,32,72,60
1-22 次のコードで生成される T オブジェクトの総数は?
T b(5);
T c[6];
T& d = b;
T e = b;
T* p = new T(4);
- A. 5
- B. 8
- C. 9
- D. 12
1-23 char a[] = "abc123", char b[] = "xyz" のとき、strcat(a, b) の結果は?
- A. abc123xyz
- B. abc123
- C. xyz
- D. メモリオーバーフロー
1-24 次の列挙型で、グローバル変数 x の初期値は?
enum string {
x1,
x2,
x3 = 10,
x4,
x5,
} x;
- A. 5
- B. 12
- C. 0
- D. 不確定値
1-25 次のコードに関する正しい記述は?
myClass::foo() {
delete this;
}
void func() {
myClass* a = new myClass();
a->foo();
}
- A. スタックオーバーフローを引き起こす
- B. 上記のどれも正しくない
- C. コンパイルできない
- D. セグメンテーションフォールトを引き起こす
1-26 64ビット環境での次の構造体に関する正しい記述は?
struct T {
char a;
int* d;
int b;
int c:16;
double e;
};
T* p;
- A.
sizeof(p) == 24 - B.
sizeof(*p) == 24 - C.
sizeof(p->a) == 1 - D.
sizeof(p->e) == 4
二、解説
1-1 配列 a[2][3] の有効なインデックスは行が [0,1]、列が [0,2]。Aは a[0][2] となり有効。Bは列インデックスが範囲外。CとDはC++の文法に反する。
1-2 関数オーバーロードは、同一関数名で引数リスト(型・数・順序)が異なることを要求する。戻り値型はオーバーロードの条件にはならない。
1-3 初期値 CY = -1。1回目のループで CY = 1 となり、!CY は false になるためループ終了。
1-4 文字列リテラルは末尾にヌル文字 \0 を含むため、"ChangYou"(8文字)+\0 で計9バイト。
1-5 二次元配列 a は「配列の配列」であり、a+i は i 行目へのポインタ、*(a+i) は i 行目の配列(=先頭要素へのポインタ)、*(a+i)+j は (i,j) 要素へのポインタ、最終的に *(*(a+i)+j) で値を取得。
1-6 ビッグエンディアンでは整数3(0x00000003)の上位2バイトは0。unionにより short b は上位2バイトを参照し0となるため、0 & 1 = 0。
1-7 ポインタ経由で変数 a の値を0に書き換えているため、出力は0。
1-8 派生クラス B は独自の num メンバを持つ。基底クラスのコンストラクタで A::num は1になるが、B::print() は B::num(初期値0)を出力。
1-9 i=0 と i=5 で条件成立し、それぞれ x=0 と x=1 を出力。ループ終了後に x=2 を出力 → 「012」。
1-10 B が純粋仮想関数 a() を実装していないため抽象クラスとなり、インスタンス化不可 → コンパイルエラー。
1-11 抽象クラスでもvptr(8バイト)と int*(8バイト)の合計16バイト(アライメント考慮)。
1-12 局所性原理は「プログラムが特定のメモリ領域を集中してアクセスする傾向」を指し、これは仮想記憶の有効性の根拠となる。
1-13 相互排他のセマフォ初期値は1。最大(m-1)個のプロセスが待機状態になるため、最小値は1-(m-1)=2-mではなく1-m(例:m=2なら範囲[1,0,-1]→1から1-2=-1)。
1-14 I/Oデバイス状態はデバイス管理モジュールが保持し、PCBには含まれない。
1-15 セグメンテーションは論理的なプログラム単位(関数・データなど)で分割され、動的リンクに適している。
1-16 LRUで4フレーム使用時、ページ欠落9回のうち最初の4回は置換なし、残り5回が置換発生 → 答えは5。
1-17 幅優先探索(BFS)はキューを用いてノードを階層ごとに処理する。
1-18 ヒープは完全二分木の性質を持つ(最後のレベル以外は完全に埋まり、最後のレベルは左詰め)。
1-19 std::map は赤黒木を内部実装に用いることで、O(log n) の操作を保証する。
1-20 ハッシュテーブルの平均検索長は負荷率や衝突解決法に依存し、要素数nに直接比例しない。
1-21 クイックソートの各パスでは、ピボットより左はすべて≤、右はすべて≥となる。Dの並びはこの条件を満たさない可能性がある。
1-22 オブジェクト生成数:b(1) + c[6](6) + e(1) + new(1) = 9。参照は新規オブジェクトを作らない。
1-23 a は7バイト("abc123\0")しか確保されておらず、"xyz"を追加すると9バイト必要 → バッファオーバーフロー。
1-24 グローバル変数はゼロ初期化されるため、未代入の列挙子 x は0。
1-25 delete this 自体は合法。ただし、その後ポインタを使用すると未定義動作だが、このコードでは使用していないため、実行時エラーは発生しない。コンパイルも可能。よって「どれも正しくない」。
1-26 ポインタ p のサイズは8バイト(64ビット)。構造体 T のサイズはアライメントにより24以上。メンバー a はchar型なので1バイト、e はdoubleで8バイト。したがってCのみ正しい。