第13回 期末試験対策演習¶

今回は新しい内容を学びません。第09回〜第12回(リストと range の応用、2重ループ、整列アルゴリズム、探索アルゴリズム)の範囲で、期末試験と同じ種類・同じ形式 の問題を全67問用意しました。時間内にできるところまで解いてください。


  • 全67問。答えはすべて 0〜9 の整数1桁 です。
  • 出力を答える問題(選択肢がない問題):プログラムやフローチャートを実行したときに表示される数が答えです(必ず1桁になります)。
  • 選択問題(答えの候補が (0)(1)(2)… と並ぶ問題):正しい選択肢の 番号(0 から始まります) が答えです。
  • 穴埋め問題:プログラムやフローチャートの空欄(【?】、図では破線の箱)に入るものを選択肢から選び、その 番号 が答えです。
  • 提出用ノートブック(2xBxxxxx_13_drill.ipynb)の q1 = 〜 に答えの数字を書き、.py 形式でダウンロードして提出してください。
  • 答え合わせは自分でできます: 出力を答える問題・穴埋め問題は、コードを Colab に打ち込んで実行すれば、正しい答えが確かめられます。予想 → 実行 → 確認、の繰り返しがそのまま試験勉強になります。

この回の採点について¶

このドリルの採点は、提出したかどうかだけ で判断します。中身の正誤は採点しません。

つまり、その気になれば生成AI に解かせて埋めることもできてしまいます。それでも成績上の扱いは同じです。ただし、期末試験は 紙とマークシート で行うので、試験本番で AI は使えません。このドリルは期末試験と 同じ種類・同じ形式 の問題でできています。いま自分の頭で解けば、このドリルがそのまま試験対策になります。どう使うかは各自にまかせます。

第1部 リストと range の応用(第09回の範囲)¶

(問1〜問17)


問 1 次のプログラムの出力を答えてください。

word = "computer"
print(len(word))

問 2 次のプログラムの出力を答えてください。

words = ["cat", "tiger", "lion", "panda"]
c = 0
for i in range(0, len(words)):
    if len(words[i]) >= 5:
        c = c + 1
print(c)

問 3 次のプログラムの出力を答えてください。

word = "success"
c = 0
for i in range(0, len(word)):
    if word[i] == "s":
        c = c + 1
print(c)

問 4 次のプログラムの出力を答えてください。

a = [9, 4, 6, 2, 7]
print(a[-1])

問 5 次のプログラムの出力を答えてください。

a = [5, 1, 8, 3]
print(a[-3])

問 6 次のプログラムの出力を答えてください。

c = 0
for i in range(0, 9, 2):
    c = c + 1
print(c)

問 7 次のプログラムは、1 から 9 までの奇数(1、3、5、7、9)を1行ずつ出力します。空欄【?】に入るものを選んでください。

for i in range(1, 10, 【?】):
    print(i)
  • (0) 3
  • (1) 1
  • (2) 2
  • (3) 9
  • (4) 0

問 8 次のプログラムの出力を答えてください。

for i in range(6, 2, -1):
    x = i
print(x)

問 9 次のプログラムは、10 から 1 までの整数を大きい順に1行ずつ出力します。空欄【?】に入るものを選んでください。

for i in range(10, 【?】, -1):
    print(i)
  • (0) 1
  • (1) 0
  • (2) -1
  • (3) 11
  • (4) 10

問 10 次のフローチャートの出力を答えてください。

問10のフローチャート

問 11 次のフローチャートは、3 + 2 + 1 を計算して 6 と出力します。空欄(破線の箱)に入るものを選んでください。

問11のフローチャート
  • (0) s = s + i
  • (1) s = i
  • (2) s = s + 1
  • (3) print(s)
  • (4) s = 0

問 12 for i in range(3, 10, 3): の i が取る値の並びとして正しいものを選んでください。

  • (0) 3, 6, 9
  • (1) 0, 3, 6, 9
  • (2) 3, 4, 5
  • (3) 3, 6, 9, 12
  • (4) エラーになる

問 13 次のプログラムの出力を答えてください。

x = 4
y = 9
tmp = x
x = y
y = tmp
print(y)

問 14 次のプログラムは、x と y の値を入れ替えて 8 3 と出力します。空欄【?】に入るものを選んでください。

x = 3
y = 8
tmp = 【?】
x = y
y = tmp
print(x, y)
  • (0) y
  • (1) x
  • (2) tmp
  • (3) 0
  • (4) x + y

問 15 次のプログラムの出力を答えてください。

a = [6, 2, 9]
tmp = a[0]
a[0] = a[2]
a[2] = tmp
print(a[0])

問 16 次のプログラムの出力を答えてください。

a = [3, 5, 2, 4]
for i in range(0, len(a) - 1):
    if a[i] > a[i + 1]:
        tmp = a[i]
        a[i] = a[i + 1]
        a[i + 1] = tmp
print(a[1])

問 17 次のプログラムの出力を答えてください。

fruits = ["apple", "kiwi", "melon"]
print(len(fruits[2]))

第2部 2重ループ(第10回の範囲)¶

(問18〜問33)


問 18 次のプログラムの出力を答えてください。

c = 0
for i in range(0, 3):
    for j in range(0, 3):
        c = c + 1
print(c)

問 19 次のプログラムの出力を答えてください。

c = 0
for i in range(0, 2):
    for j in range(0, 3):
        c = c + 1
print(c)

問 20 次のプログラムの出力を答えてください。

for i in range(1, 3):
    for j in range(1, 4):
        x = i * j
print(x)

問 21 次のプログラムで c = c + 1 が実行される回数を選んでください。

c = 0
for i in range(0, 4):
    for j in range(0, 2):
        c = c + 1
  • (0) 4
  • (1) 2
  • (2) 6
  • (3) 8
  • (4) 16

問 22 次のプログラムの出力を答えてください。

numbers1 = [1, 3]
numbers2 = [0, 2]
total = 0
for i in range(0, len(numbers1)):
    for j in range(0, len(numbers2)):
        total = total + numbers1[i] * numbers2[j]
print(total)

問 23 次のプログラムの出力を答えてください。

line = ""
for i in range(0, 3):
    for j in range(0, 2):
        line = line + "*"
print(len(line))

問 24 次のプログラムは、* の三角形(1行目 *、2行目 **、3行目 ***、4行目 ****)を出力します。空欄【?】に入るものを選んでください。

for i in range(0, 4):
    line = ""
    for j in range(0, 【?】):
        line = line + "*"
    print(line)
  • (0) i
  • (1) i + 1
  • (2) 4
  • (3) j
  • (4) i - 1

問 25 次のプログラムの出力の4行目として正しいものを選んでください。

for i in range(0, 2):
    for j in range(0, 3):
        print(i, j)
  • (0) 0 2
  • (1) 1 0
  • (2) 1 1
  • (3) 0 1
  • (4) 1 2

問 26 次のプログラムの出力を答えてください。

c = 0
for i in range(0, 3):
    for j in range(0, 3):
        if (i + j) % 2 == 0:
            c = c + 1
print(c)

問 27 次のプログラムの出力を答えてください。

numbers = [1, 4, 2, 6]
c = 0
for i in range(0, len(numbers)):
    for j in range(i + 1, len(numbers)):
        if numbers[i] * numbers[j] >= 8:
            c = c + 1
print(c)

問 28 次のプログラムは、リストから2つ選ぶ重複のないペア(i < j の組)を 1 2 / 1 3 / 2 3 の3行で出力します。空欄【?】に入るものを選んでください。

numbers = [1, 2, 3]
for i in range(0, len(numbers)):
    for j in range(【?】, len(numbers)):
        print(numbers[i], numbers[j])
  • (0) 0
  • (1) i
  • (2) i + 1
  • (3) 1
  • (4) j

問 29 次のプログラムの出力を答えてください。

c = 0
for i in range(0, 4):
    for j in range(0, i):
        c = c + 1
print(c)

問 30 長方形や三角形を1行ずつ表示するとき、line = "" を外側ループの中(各行のはじめ)に書くのはなぜですか。

  • (0) 行ごとに line を空に作り直すため
  • (1) プログラムを速くするため
  • (2) エラーを防ぐため
  • (3) line を数値にするため
  • (4) 内側ループの回数を変えるため

問 31 次のプログラムの出力を答えてください。

c = 0
for i in range(0, 4):
    for j in range(0, 4):
        if i == j:
            c = c + 1
print(c)

問 32 次のプログラムの出力を答えてください。

colors = ["red", "blue"]
sizes = ["S", "M", "L"]
c = 0
for i in range(0, len(colors)):
    for j in range(0, len(sizes)):
        if len(colors[i]) == 4:
            c = c + 1
print(c)

問 33 次のプログラムの出力を答えてください。

c = 0
for i in range(1, 5):
    for j in range(1, 5):
        if i * j == 6:
            c = c + 1
print(c)

第3部 整列アルゴリズム(第11回の範囲)¶

(問34〜問50)


問 34 次のプログラムの出力を答えてください。

numbers = [7, 3, 9, 1, 6]
min_index = 0
for j in range(1, len(numbers)):
    if numbers[j] < numbers[min_index]:
        min_index = j
print(min_index)

問 35 次のプログラムの出力を答えてください。

numbers = [9, 2, 8, 5]
max_index = 0
for j in range(1, len(numbers)):
    if numbers[j] > numbers[max_index]:
        max_index = j
print(max_index)

問 36 次のプログラムは、リストの中の最小値の位置(インデックス)を出力します。空欄【?】に入るものを選んでください。

numbers = [4, 1, 5, 2]
min_index = 0
for j in range(1, len(numbers)):
    if numbers[j] 【?】 numbers[min_index]:
        min_index = j
print(min_index)
  • (0) >
  • (1) ==
  • (2) <
  • (3) !=
  • (4) +

問 37 次のプログラムの出力を答えてください。

numbers = [2, 3, 1]
n = len(numbers)
for i in range(0, n - 1):
    for j in range(0, n - 1 - i):
        if numbers[j] > numbers[j + 1]:
            tmp = numbers[j]
            numbers[j] = numbers[j + 1]
            numbers[j + 1] = tmp
print(numbers[0])

問 38 次のプログラムの出力を答えてください。

numbers = [4, 1, 3, 2]
n = len(numbers)
c = 0
for i in range(0, n - 1):
    for j in range(0, n - 1 - i):
        c = c + 1
        if numbers[j] > numbers[j + 1]:
            tmp = numbers[j]
            numbers[j] = numbers[j + 1]
            numbers[j + 1] = tmp
print(c)

問 39 次のプログラムの出力を答えてください。

numbers = [1, 3, 2, 4]
n = len(numbers)
c = 0
for i in range(0, n - 1):
    for j in range(0, n - 1 - i):
        if numbers[j] > numbers[j + 1]:
            tmp = numbers[j]
            numbers[j] = numbers[j + 1]
            numbers[j + 1] = tmp
            c = c + 1
print(c)

問 40 次のプログラムは、バブルソートでリストを小さい順に整列し、[1, 2, 3] と出力します。空欄【?】に入るものを選んでください。

numbers = [3, 1, 2]
n = len(numbers)
for i in range(0, n - 1):
    for j in range(0, n - 1 - i):
        if numbers[j] > numbers[j + 1]:
            tmp = numbers[j]
            numbers[j] = numbers[j + 1]
            numbers[j + 1] = 【?】
print(numbers)
  • (0) tmp
  • (1) numbers[j]
  • (2) numbers[j + 1]
  • (3) j
  • (4) 0

問 41 次のフローチャートの出力を答えてください。

問41のフローチャート

問 42 次のフローチャートは、リストの最小値を探して 4 と出力します。空欄(破線のひし形)に入る条件を選んでください。

問42のフローチャート
  • (0) numbers[j] > m
  • (1) numbers[j] < m
  • (2) m < numbers[j]
  • (3) numbers[j] == m
  • (4) j < m

問 43 小さい順(昇順)の選択ソートを、大きい順(降順)に変える方法として正しいものを選んでください。

  • (0) 内側の比較の < を > に変える(最小値ではなく最大値を選ぶ)
  • (1) tmp を使わずに入れ替える
  • (2) 外側ループを range(0, n) に変える
  • (3) 交換を内側ループの中に移す
  • (4) 何も変えなくてよい

問 44 次のプログラムの出力を答えてください。

numbers = [4, 1, 6]
n = len(numbers)
for i in range(0, n - 1):
    for j in range(0, n - 1 - i):
        if numbers[j] < numbers[j + 1]:
            tmp = numbers[j]
            numbers[j] = numbers[j + 1]
            numbers[j + 1] = tmp
print(numbers[0])

問 45 次のプログラムは、バブルソートでリストを大きい順(降順)に整列し、[6, 4, 1] と出力します。空欄【?】に入るものを選んでください。

numbers = [4, 1, 6]
n = len(numbers)
for i in range(0, n - 1):
    for j in range(0, n - 1 - i):
        if numbers[j] 【?】 numbers[j + 1]:
            tmp = numbers[j]
            numbers[j] = numbers[j + 1]
            numbers[j + 1] = tmp
print(numbers)
  • (0) >
  • (1) <
  • (2) ==
  • (3) !=
  • (4) +

問 46 次のプログラムの出力を答えてください。

numbers = [5, 3, 6, 2]
n = len(numbers)
for i in range(0, n - 1):
    min_index = i
    for j in range(i + 1, n):
        if numbers[j] < numbers[min_index]:
            min_index = j
    tmp = numbers[i]
    numbers[i] = numbers[min_index]
    numbers[min_index] = tmp
print(numbers[1])

問 47 次のプログラムの出力を答えてください。

numbers = [6, 4, 5, 2, 3]
min_index = 0
for j in range(1, len(numbers)):
    if numbers[j] < numbers[min_index]:
        min_index = j
tmp = numbers[0]
numbers[0] = numbers[min_index]
numbers[min_index] = tmp
print(numbers[3])

問 48 要素数4のリストをバブルソート(効率化版。内側は range(0, n - 1 - i))で整列するとき、比較が行われる回数を選んでください。

  • (0) 3
  • (1) 4
  • (2) 6
  • (3) 12
  • (4) 16

問 49 次のプログラムは、選択ソートでリストを小さい順に整列し、[1, 2, 3] と出力します。空欄【?】に入るものを選んでください。

numbers = [1, 3, 2]
n = len(numbers)
for i in range(0, n - 1):
    min_index = 【?】
    for j in range(i + 1, n):
        if numbers[j] < numbers[min_index]:
            min_index = j
    tmp = numbers[i]
    numbers[i] = numbers[min_index]
    numbers[min_index] = tmp
print(numbers)
  • (0) i
  • (1) 0
  • (2) j
  • (3) 1
  • (4) n

問 50 バブルソートで比較回数 compare_count を数えるとき、compare_count = compare_count + 1 を置く場所として正しいものを選んでください。

  • (0) 内側ループの中、if の直前(if の外)
  • (1) if の中(交換と同じ場所)
  • (2) 内側ループの外
  • (3) for より前(プログラムの先頭)
  • (4) print の直後

第4部 探索アルゴリズム(第12回の範囲)¶

(問51〜問67)


問 51 次のプログラムの出力を答えてください。

numbers = [6, 2, 9]
target = 2
flg = 0
for j in range(0, len(numbers)):
    if numbers[j] == target:
        flg = 1
print(flg)

問 52 次のプログラムの出力を答えてください。

numbers = [4, 7, 5]
target = 8
flg = 0
for j in range(0, len(numbers)):
    if numbers[j] == target:
        flg = 1
print(flg)

問 53 次のプログラムは、target がリストにあれば 1、なければ 0 を出力します(ここでは 1 になります)。空欄【?】に入るものを選んでください。

numbers = [5, 3, 8]
target = 8
flg = 0
for j in range(0, len(numbers)):
    if numbers[j] == target:
        【?】
print(flg)
  • (0) flg = 1
  • (1) flg = 0
  • (2) flg = j
  • (3) flg = flg
  • (4) print(flg)

問 54 次のプログラムの出力を答えてください。

numbers = [3, 6, 3, 8]
target = 3
pos = -1
for j in range(0, len(numbers)):
    if numbers[j] == target:
        pos = j
print(pos)

問 55 次のプログラムの出力を答えてください。

numbers = [3, 6, 3, 8]
target = 3
pos = -1
for j in range(0, len(numbers)):
    if pos == -1 and numbers[j] == target:
        pos = j
print(pos)

問 56 次のプログラムは、target が最初に見つかった位置だけを記録し、1 と出力します。空欄【?】に入るものを選んでください。

numbers = [7, 4, 9, 4]
target = 4
pos = -1
for j in range(0, len(numbers)):
    if 【?】 and numbers[j] == target:
        pos = j
print(pos)
  • (0) pos == -1
  • (1) flg == 1
  • (2) j == 0
  • (3) pos == j
  • (4) numbers[j] == 4

問 57 次のプログラムの出力を答えてください。

numbers = [8, 3, 6]
target = 3
pos = -1
c = 0
for j in range(0, len(numbers)):
    if pos == -1:
        c = c + 1
        if numbers[j] == target:
            pos = j
print(c)

問 58 次のフローチャートの出力を答えてください。

問58のフローチャート

問 59 次のフローチャートは、リストの中の 4 の個数を数えて 2 と出力します。空欄(破線の箱)に入るものを選んでください。

問59のフローチャート
  • (0) c = 1
  • (1) c = j
  • (2) c = c + 1
  • (3) print(c)
  • (4) c = c + 4

問 60 整列されていないリストに二分探索をそのまま使うとどうなりますか。

  • (0) 目的の値があっても見つけられないことがある
  • (1) 必ずエラーで止まる
  • (2) 正しく動くが遅くなる
  • (3) リストが自動で整列される
  • (4) 必ず -1 になる

問 61 次のプログラムの出力を答えてください。

numbers = [2, 4, 6, 8, 10, 12, 14]
target = 6
n = len(numbers)
low = 0
high = n - 1
pos = -1
for k in range(0, n):
    if low <= high:
        mid = (low + high) // 2
        if numbers[mid] == target:
            pos = mid
            low = high + 1
        elif numbers[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
print(pos)

問 62 次のプログラムの出力を答えてください。

numbers = [1, 3, 5, 7, 9, 11, 13]
target = 13
n = len(numbers)
low = 0
high = n - 1
pos = -1
c = 0
for k in range(0, n):
    if low <= high:
        c = c + 1
        mid = (low + high) // 2
        if numbers[mid] == target:
            pos = mid
            low = high + 1
        elif numbers[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
print(c)

問 63 次のプログラムの出力として正しいものを選んでください。

numbers = [1, 3, 5, 7]
target = 4
n = len(numbers)
low = 0
high = n - 1
pos = -1
for k in range(0, n):
    if low <= high:
        mid = (low + high) // 2
        if numbers[mid] == target:
            pos = mid
            low = high + 1
        elif numbers[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
print(pos)
  • (0) -1
  • (1) 0
  • (2) 3
  • (3) 4
  • (4) エラーになる

問 64 次のプログラムは、二分探索で target の位置を探して 5 と出力します。空欄【?】に入るものを選んでください。

numbers = [1, 3, 5, 7, 9, 11, 13]
target = 11
n = len(numbers)
low = 0
high = n - 1
pos = -1
for k in range(0, n):
    if low <= high:
        mid = (low + high) // 2
        if numbers[mid] == target:
            pos = mid
            low = high + 1
        elif numbers[mid] < target:
            【?】 = mid + 1
        else:
            high = mid - 1
print(pos)
  • (0) low
  • (1) high
  • (2) mid
  • (3) pos
  • (4) target

問 65 次のプログラムの出力を答えてください。

numbers = [1, 3, 5, 7, 9]
target = 5
n = len(numbers)
low = 0
high = n - 1
pos = -1
for k in range(0, n):
    if low <= high:
        mid = (low + high) // 2
        if numbers[mid] == target:
            pos = mid
            low = high + 1
        elif numbers[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
print(low)

問 66 1000個のリストを線形探索で調べるとき、最悪の場合(目的の値が無い場合)の比較回数を選んでください。

  • (0) 約10回
  • (1) 1000回
  • (2) 500回
  • (3) 1回
  • (4) 0回

問 67 約100万個の整列済みリストから二分探索で値を探すとき、比較回数はおよそ何回になりますか。

  • (0) 約20回
  • (1) 約1000回
  • (2) 約50万回
  • (3) 約100万回
  • (4) 約2回