第6部 模擬試験
アルゴリズム 模擬試験
氏名:__________________ 得点:______/100点
注意
- 第1部から第5部までのワークを見ずに解こう
- 配列の添字は0から始まるものとする
- 疑似言語は、授業で扱ったIPAの基本情報技術者試験の表記に合わせる
- 計算問題では、答えだけでなく途中の式も書く
- すべて解き終わるまで、最後の模範解答を開かない
大問1 変数と配列の基本【25点】
問1 値の種類とC言語の型【8点】
次の値について、値の種類を「整数・実数・文字・文字列」から選び、C言語で使用する型を書こう。
| 値 | 値の種類 | C言語の型 |
|---|---|---|
120 |
______ | ______ |
3.5f |
______ | ______ |
'A' |
______ | ______ |
"START" |
______ | ______ |
問2 初期化・代入と値の変化【8点】
次のプログラムを上から順に実行します。
int a = 4;
int b = 7;
a = b;
b = a + 3;
(1)各行が、初期化・代入のどちらに当たるか答えよう
| 処理 | 初期化・代入 |
|---|---|
int a = 4; |
______ |
int b = 7; |
______ |
a = b; |
______ |
b = a + 3; |
______ |
(2)すべて実行した後の値を答えよう
a = ______
b = ______
問3 配列・添字・アドレス【9点】
次の配列を考えます。int型の1要素は4バイトで、data[0]のアドレスは4000番地とします。
int data[5] = {8, 3, 6, 1, 4};
(1)配列の要素数
______個
(2)使用できる最後の添字
______
(3)data[2]の値
______
(4)data[3]のアドレス
______番地
(5)範囲外になるものをすべて選ぼう
-
data[-1] -
data[0] -
data[4] -
data[5]
(6)次の代入後の配列全体を書こう
data[1] = data[4];
data[4] = 9;
{ __, __, __, __, __ }
大問2 基本構造・記述方法・三大ソート【45点】
問1 3つの基本構造【8点】
(1)次の処理が、順次・選択・反復のどれに当たるか答えよう
| 処理 | 基本構造 |
|---|---|
| 画像を読み込んでから画面へ表示する | ______ |
| HPが0以下ならゲームオーバーにする | ______ |
| すべての敵を1体ずつ移動させる | ______ |
(2)大きな処理ブロックとして見る
複雑なアルゴリズムの中にある選択や反復を、一つの大きな処理ブロックとしてまとめていくと、最上位では大きな処理ブロックが並ぶ何構造として捉えられますか。
答え:______構造
問2 疑似言語をトレースしよう【12点】
次の疑似言語は、配列の最大値を求めます。
整数型の配列: data ← {4, 7, 2, 9, 5}
整数型: i
整数型: maxValue ← data[0]
for (i を 1 から 4 まで 1 ずつ増やす)
if (data[i] > maxValue)
maxValue ← data[i]
endif
endfor
maxValueを出力する
トレース表を完成させよう。
i |
data[i] |
条件 data[i] > maxValue |
処理後のmaxValue |
|---|---|---|---|
| 1 | __ | __ | __ |
| 2 | __ | __ | __ |
| 3 | __ | __ | __ |
| 4 | __ | __ | __ |
出力:______
問3 日本語とフローチャートで表そう【8点】
次の疑似言語と同じ処理を、日本語とフローチャートで表そう。
整数型: score
scoreを入力する
if (score ≧ 60)
"PASS"を出力する
else
"FAIL"を出力する
endif
(1)日本語で手順を書こう
一つの番号に一つの処理を書き、実行する順番に並べよう。
1._______________________________
2._______________________________
3._______________________________
4._______________________________
(2)フローチャートを書こう
(1)と同じ処理になるフローチャートを、紙に書こう。
次の記号を正しく使うこと。
- 開始・終了:端子
scoreの入力と文字列の出力:入出力score ≧ 60:判断- 判断から分かれる流れに
YesとNoを付ける
問4 1周ごとの数列からソート名を当てよう【9点】
各ソートの一番外側の処理を1周とします。1周が終わるごとの数列を、最後まで並べています。
それぞれ、バブルソート・選択ソート・挿入ソートのどれかを答えよう。
(1)
5 1 4 2 3
↓
1 4 2 3 5
↓
1 2 3 4 5
↓
1 2 3 4 5
↓
1 2 3 4 5
ソート名:____________
(2)
5 1 4 2 3
↓
1 5 4 2 3
↓
1 2 4 5 3
↓
1 2 3 5 4
↓
1 2 3 4 5
ソート名:____________
(3)
5 1 4 2 3
↓
1 5 4 2 3
↓
1 4 5 2 3
↓
1 2 4 5 3
↓
1 2 3 4 5
ソート名:____________
問5 バブルソートを完成させよう【8点】
空欄を埋めよう。
○bubbleSort(整数型の配列: data, 整数型: n)
整数型: i, j
for (j を 0 から ______ まで 1 ずつ増やす)
for (i を __ から ______ まで 1 ずつ増やす)
if (________ > ________)
swap(________, ________)
endif
endfor
endfor
大問3 ゲームの基本的な構成【30点】
問1 ゲームループ【6点】
空欄を埋めよう。
________();
while (ゲームを続ける)
{
________();
________();
}
________();
入力を調べる Input()は、どの関数の中から呼び出しますか。
答え:________の中
問2 状態に応じてUpdate()とDraw()を切り替えよう【10点】
空欄に関数名を書こう。
void Update()
{
________();
if (state == TITLE)
{
____________;
}
else if (state == PLAY)
{
____________;
}
else if (state == CLEAR)
{
____________;
}
else if (state == GAMEOVER)
{
____________;
}
}
void Draw()
{
if (state == TITLE)
{
____________;
}
else if (state == PLAY)
{
____________;
}
else if (state == CLEAR)
{
____________;
}
else if (state == GAMEOVER)
{
____________;
}
}
問3 状態の変化をトレースしよう【6点】
ゲームは TITLE の状態から始まります。Update()の中で状態が変わった場合、その直後の Draw()は変更後の状態に対応する関数を呼び出します。
表を完成させよう。
| フレーム | Update前のstate |
出来事 | 呼ばれる更新関数 | Update後のstate |
呼ばれる描画関数 |
|---|---|---|---|---|---|
| 1 | TITLE |
開始ボタンを押す | ______ | ____ | ______ |
| 2 | PLAY |
何も起きない | ______ | ____ | ______ |
| 3 | PLAY |
HPが0になる | ______ | ____ | ______ |
| 4 | GAMEOVER |
戻るボタンを押す | ______ | ____ | ______ |
問4 FPSとデルタタイム【8点】
(1)60 FPSで2.5秒間動かした
処理するフレーム数を求めよう。
式:________________
答え:______フレーム
(2)50 FPSの1フレーム
1フレームの時間を秒単位で求めよう。
式:________________
答え:______秒
(3)1秒間に150ピクセル移動するプレイヤー
deltaTimeが0.02秒だったとき、1フレームの移動量を求めよう。
式:________________
答え:______ピクセル
(4)3フレーム後の座標
最初の座標を playerX = 10.0、速さを毎秒150ピクセルとします。3フレームの deltaTimeは、順に0.016秒、0.020秒、0.014秒でした。
式:______________________________
答え:playerX = ______
模範解答
得点の目安
| 得点 | 復習の目安 |
|---|---|
| 90〜100点 | 各問題の説明までできるか確認しよう |
| 70〜89点 | 間違えた大問に対応する部を復習しよう |
| 50〜69点 | トレース表を書きながら、第1部から順に確認しよう |
| 0〜49点 | 用語と基本形を確認してから、もう一度解こう |
大問1の模範解答を見る
問1
| 値 | 値の種類 | C言語の型 |
|---|---|---|
120 |
整数 | int |
3.5f |
実数 | float |
'A' |
文字 | char |
"START" |
文字列 | charの配列 |
問2
| 処理 | 初期化・代入 |
|---|---|
int a = 4; |
初期化 |
int b = 7; |
初期化 |
a = b; |
代入 |
b = a + 3; |
代入 |
値は次の順に変化します。
最初 a = 4、b = 7
a = b a = 7、b = 7
b = a+3 a = 7、b = 10
したがって、最後は a = 7、b = 10です。
問3
(1)5個
(2)4
(3)6
(4)4012番地
(5)data[-1]、data[5]
(6){8, 4, 6, 1, 9}
アドレスは次のように4ずつ増えます。
| 要素 | data[0] |
data[1] |
data[2] |
data[3] |
data[4] |
|---|---|---|---|---|---|
| アドレス | 4000 | 4004 | 4008 | 4012 | 4016 |
大問2の模範解答を見る
問1
| 処理 | 基本構造 |
|---|---|
| 画像を読み込んでから画面へ表示する | 順次 |
| HPが0以下ならゲームオーバーにする | 選択 |
| すべての敵を1体ずつ移動させる | 反復 |
複雑な内部を大きな処理ブロックへまとめると、最上位では大きな処理ブロックが並ぶ順次構造として捉えられます。
問2
i |
data[i] |
条件 data[i] > maxValue |
処理後のmaxValue |
|---|---|---|---|
| 1 | 7 | 真 | 7 |
| 2 | 2 | 偽 | 7 |
| 3 | 9 | 真 | 9 |
| 4 | 5 | 偽 | 9 |
出力は 9です。
問3
(1)日本語による記述
1.scoreに整数を入力する。
2.scoreが60以上かを調べる。
3.60以上なら「PASS」と出力する。
4.60未満なら「FAIL」と出力する。
(2)フローチャート

図1 scoreが60以上かを判定するフローチャート
問4
(1)バブルソート
(2)選択ソート
(3)挿入ソート
- バブルソートは、1周ごとに右側へ大きい値が確定します
- 選択ソートは、未確定部分の最小値が左端へ移動します
- 挿入ソートは、左側の整列済み範囲が1個ずつ広がります
問5
○bubbleSort(整数型の配列: data, 整数型: n)
整数型: i, j
for (j を 0 から n - 2 まで 1 ずつ増やす)
for (i を 0 から n - 2 まで 1 ずつ増やす)
if (data[i] > data[i + 1])
swap(data[i], data[i + 1])
endif
endfor
endfor
大問3の模範解答を見る
問1
Initialize();
while (ゲームを続ける)
{
Update();
Draw();
}
Release();
Input()は Update()の中から呼び出します。
問2
void Update()
{
Input();
if (state == TITLE)
{
TitleUpdate();
}
else if (state == PLAY)
{
PlayUpdate();
}
else if (state == CLEAR)
{
ClearUpdate();
}
else if (state == GAMEOVER)
{
GameOverUpdate();
}
}
void Draw()
{
if (state == TITLE)
{
TitleDraw();
}
else if (state == PLAY)
{
PlayDraw();
}
else if (state == CLEAR)
{
ClearDraw();
}
else if (state == GAMEOVER)
{
GameOverDraw();
}
}
問3
| フレーム | Update前のstate |
出来事 | 呼ばれる更新関数 | Update後のstate |
呼ばれる描画関数 |
|---|---|---|---|---|---|
| 1 | TITLE |
開始ボタンを押す | TitleUpdate() |
PLAY |
PlayDraw() |
| 2 | PLAY |
何も起きない | PlayUpdate() |
PLAY |
PlayDraw() |
| 3 | PLAY |
HPが0になる | PlayUpdate() |
GAMEOVER |
GameOverDraw() |
| 4 | GAMEOVER |
戻るボタンを押す | GameOverUpdate() |
TITLE |
TitleDraw() |
問4
(1)
60 × 2.5 = 150フレーム
(2)
1 ÷ 50 = 0.02秒
(3)
150 × 0.02 = 3ピクセル
(4)
経過時間 = 0.016 + 0.020 + 0.014
= 0.050秒
移動距離 = 150 × 0.050
= 7.5ピクセル
playerX = 10.0 + 7.5
= 17.5
No Comments