Skip to main content

第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)フローチャート

問3のフローチャート解答

図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