【キーワード:繰返し/条件分岐/剰余】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(for文の範囲は「1から6まで,6を含む」とする)
x ← 0
for i ← 1 to 6 do
if i mod 3 = 0 then
x ← x + i
else
x ← x + 1
end if
end for
print(x)
イ
(テクノロジ系)
for文(反復)で $i=1$ から $6$ まで回し,剰余(mod)で「3の倍数かどうか」を判定して加算する。
よって 13(イ)が正しい。
【キーワード:配列/最大値探索】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(配列の添字は1から始まり,for文の範囲は上限を含む)
a ← [7, 2, 9, 9, 1]
m ← a[1]
for i ← 2 to 5 do
if a[i] > m then
m ← a[i]
end if
end for
print(m)
イ
(テクノロジ系)
これは配列から 最大値(max)を求める基本処理。初期値 $m=a[1]=7$ とし,2番目以降を見て より大きければ更新する。
よって出力は 9(イ)。
【キーワード:文字列/カウント】
次の擬似言語は,文字列 t に含まれる文字 'o' の個数を数える処理である。出力される値として正しいものはどれか。
(文字列の添字は1から始まり,length(t) は文字数を返す)
t ← "tokyo"
count ← 0
for i ← 1 to length(t) do
if t[i] = 'o' then
count ← count + 1
end if
end for
print(count)
イ
(テクノロジ系)
文字列 "tokyo" は t o k y o の5文字で,'o' は2回(2文字目と5文字目)出現する。よって count=2(イ)。
【キーワード:繰返し/変数更新】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
n ← 5
p ← 1
while n > 1 do
p ← p * n
n ← n - 2
end while
print(p)
ウ
(テクノロジ系)
while文(反復)で $n>1$ の間,$p$ に $n$ を掛け,$n$ を2ずつ減らす。
よって出力は 15(ウ)。
【キーワード:条件分岐/代入】
次の擬似言語を実行したとき,出力される a と b の組として正しいものはどれか。
a ← 4
b ← 7
if a > b then
temp ← a
a ← b
b ← temp
else
b ← b - a
end if
print(a, b)
ア
(テクノロジ系)
条件は $a>b$ かどうか。初期値は $a=4,b=7$ なので $a>b$ は偽。よって else 節が実行され,$b←b-a$ となる。
よって出力は (4,3)(ア)。
【キーワード:配列/条件分岐/加減算】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(配列の添字は1から始まり,for文の範囲は上限を含む)
a ← [2, 5, 7, 1, 6]
s ← 0
for i ← 1 to 5 do
if a[i] mod 2 = 0 then
s ← s + a[i]
else
s ← s - a[i]
end if
end for
print(s)
ア
(テクノロジ系)
配列の各要素について,偶数なら加算,奇数なら減算する。
よって -5(ア)。
【キーワード:while/剰余/カウント】
次の擬似言語は,1から20までの整数のうち,3の倍数の個数を数える処理である。出力される値として正しいものはどれか。
i ← 1
c ← 0
while i ≤ 20 do
if i mod 3 = 0 then
c ← c + 1
end if
i ← i + 1
end while
print(c)
イ
(テクノロジ系)
1~20の3の倍数は 3,6,9,12,15,18 の6個。よって c=6(イ)。
【キーワード:二重ループ/積の加算】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(for文の範囲は上限を含む)
s ← 0
for i ← 1 to 3 do
for j ← 1 to 2 do
s ← s + i * j
end for
end for
print(s)
ウ
(テクノロジ系)
二重ループで $i=1,\ldots,3$,$j=1,\ldots,2$ の全組合せについて $i*j$ を加算する。
$$ \begin{aligned} s&=(1\cdot1+1\cdot2) \\ &+(2\cdot1+2\cdot2) \\ &+(3\cdot1+3\cdot2) \\ &= (1+2)+(2+4)+(3+6) \\ &= 3+6+9=18 \end{aligned} $$
よって 18(ウ)。
【キーワード:関数/反復/条件分岐】
次の擬似言語を実行したとき,最終的に出力される値として正しいものはどれか。
(整数の割り算は割り切れるものとする)
function f(n)
if n mod 2 = 0 then
return n / 2
else
return 3*n + 1
end if
end function
x ← 6
for k ← 1 to 3 do
x ← f(x)
end for
print(x)
イ
(テクノロジ系)
関数 f(n) は「偶数なら半分,奇数なら $3n+1$」を返す。
よって最終出力は 5(イ)。
【キーワード:配列/要素の挿入/後ろからシフト】
次の擬似言語は,配列 a の pos 番目に val を挿入するため,後ろの要素を1つずつ後方へずらす処理である。出力される配列として正しいものはどれか。
(配列の添字は1から始まり,for文の範囲は上限を含む)
a ← [1, 2, 3, 4, 5]
pos ← 3
val ← 9
for i ← 5 down to pos + 1 do
a[i] ← a[i - 1]
end for
a[pos] ← val
print(a[1], a[2], a[3], a[4], a[5])
ア
(テクノロジ系)
挿入のために 後ろから(down to) シフトするのがポイント。前からずらすと上書きが起きやすい。
初期:a=[1,2,3,4,5],pos=3
よって (1,2,9,3,4)(ア)。
【キーワード:整数除算/剰余/桁の処理】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(div は整数除算,mod は剰余を表す)
n ← 5072
s ← 0
while n > 0 do
s ← s + (n mod 10)
n ← n div 10
end while
print(s)
ウ
(テクノロジ系)
これは整数 $n$ の 各桁の和を求める典型処理。n mod 10 で 最下位桁を取り出し,n div 10 で 1桁削る。
よって 14(ウ)。
mod 10 を 0/1判定のように誤解してしまい,桁の値ではなく別の量を数える誤りに近い。これは 剰余(mod)の用途の誤認。div を減算と誤読するなど,演算を混同した場合。これは 算術演算の取り違えに相当。【キーワード:配列/探索/最小値】
次の擬似言語は,配列 a の最小値を求める処理である。出力される値として正しいものはどれか。
(配列の添字は1から始まる)
a ← [8, 3, 6, 2, 7]
m ← a[1]
for i ← 2 to 5 do
if a[i] < m then
m ← a[i]
end if
end for
print(m)
ア
(テクノロジ系)
初期値 $m=a[1]=8$ とし,2番目以降を見て より小さければ更新する。これは 最小値(min)探索の基本。
よって 2(ア)。
< を > と誤読して最大値を探したり,条件を逆に読む誤りに近い。これは 比較演算子の取り違え(最大値探索の説明)に相当。【キーワード:論理演算/優先順位】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(and は論理積,or は論理和,not は否定であり,優先順位は not > and > or とする)
a ← true
b ← false
c ← true
if (a and b) or (not b and c) then
print(1)
else
print(0)
end if
イ
(テクノロジ系)
式を部分ごとに評価する。
従って if 条件は真となり,1(イ)を出力する。
or のどちらかが真でも真になる点を見落とし,「両方真でないとだめ」と誤解した場合。これは 論理和(OR)の説明に相当。【キーワード:キュー/先入れ先出し】
次の操作を順に行ったとき,最後に dequeue で取り出される値として正しいものはどれか。
(キューは 先入れ先出し(FIFO)とする)
enqueue(10)
enqueue(20)
x ← dequeue()
enqueue(30)
enqueue(x)
y ← dequeue()
z ← dequeue()
print(z)
ウ
(テクノロジ系)
キュー(queue)は FIFO:先に入れたものから先に出る。
操作を追う(左が先頭):
よって 30(ウ)。
z ではなく y を出力すると誤解した場合。これは 手順(処理順)の読み違い。enqueue の引数や演算があると誤解した場合。これは データ構造操作と計算処理の混同に相当。【キーワード:線形探索/見つかった位置】
次の擬似言語は,配列 a から値 key を探索し,見つかった位置(添字)を pos に格納して出力する。出力される pos の値として正しいものはどれか。
(見つからない場合は pos は -1 のままとする。配列の添字は1から始まる)
a ← [4, 6, 6, 2, 6]
key ← 6
pos ← -1
for i ← 1 to 5 do
if a[i] = key then
pos ← i
end if
end for
print(pos)
エ
(テクノロジ系)
この探索は一致するたびに pos ← i で 上書きするため,最終的には「最後に見つかった位置」が残る。
配列 a=[4,6,6,2,6] で key=6 は 2,3,5 番目にある。
ループ終了時点で pos は最後の一致位置 5 となる。よって 5(エ)。
break があると誤解)。これは 線形探索(最初の一致)の説明に相当。【キーワード:スタック/後入れ先出し】
次の操作を順に行ったとき,最後に pop で取り出される値として正しいものはどれか。
(スタックは 後入れ先出し(LIFO)とする)
push(1)
push(2)
push(3)
x ← pop()
push(4)
push(x)
y ← pop()
z ← pop()
print(z)
エ
(テクノロジ系)
スタック(stack)は LIFO:後から入れたものから先に出る。
操作を追う(右がトップ):
ここで z=4 なので正解は エに見えるが,問は「最後にpopで取り出される値として」とあるため,z ← pop() が最後の pop で取り出した値、すなわち 4。したがって正解は エ。
(解答を エ に訂正する。)
pop で取り出されるのは 4。【キーワード:二分探索/比較回数】
昇順に整列された要素数16の配列に対して,二分探索で目的の要素を探索する。最悪の場合に必要な比較回数として正しいものはどれか。
(比較回数は「中央値との大小比較」を1回と数える)
イ
(テクノロジ系)
二分探索は探索範囲を半分に絞る。要素数 $n$ のとき最悪比較回数はおおむね $\lceil\log_2 n\rceil$ 回。
$$ \log_2 16 = 4 $$
ただし「見つからない場合」も含む最悪ケースでは,探索範囲が 1 要素になったあとにもう一度比較が発生しうるため,ITパスポートの典型の数え方では 5回とすることが多い(範囲判定・終了判定を含める扱い)。
したがって 5(イ)が正しい。
【キーワード:ソート/交換回数】
次の擬似言語は,配列 a を昇順に並べ替える処理である。処理終了後の配列として正しいものはどれか。
(for文の範囲は上限を含む。a[i] と a[j] を入れ替える操作を swap とする)
a ← [3, 1, 2]
for i ← 1 to 2 do
for j ← i + 1 to 3 do
if a[i] > a[j] then
swap(a[i], a[j])
end if
end for
end for
print(a[1], a[2], a[3])
ア
(テクノロジ系)
これは 選択ソート(selection sort)に近い動きで,前の位置に小さい値を持ってくる。
手順追跡:
よって (1,2,3)(ア)。
【キーワード:再帰/呼び出し回数】
次の擬似言語を実行したとき,g(3) の戻り値として正しいものはどれか。
function g(n)
if n = 0 then
return 0
else
return n + g(n - 1)
end if
end function
print(g(3))
イ
(テクノロジ系)
これは再帰で 1からnまでの和を求める形。
$$ \begin{aligned} g(3)&=3+g(2)\ g(2)&=2+g(1)\ g(1)&=1+g(0)\ g(0)&=0 \end{aligned} $$
よって
$$ g(3)=3+2+1+0=6 $$
従って 6(イ)。
【キーワード:フローチャート/条件分岐/反復回数】
ある処理は次の規則で動く。初期値 $x=1$ とし,処理を3回繰り返したときの $x$ の値として正しいものはどれか。
(各回で次の操作を行う:$x$ が偶数なら $x←x/2$,奇数なら $x←2x+1$)
ウ
(テクノロジ系)
初期 $x=1$(奇数)から開始し、3回更新する。
よって 15(ウ)。
【キーワード:二重ループ/回数カウント】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(for文の範囲は上限を含む)
x ← 0
for i ← 1 to 4 do
for j ← 1 to i do
x ← x + 1
end for
end for
print(x)
イ
(テクノロジ系)
内側のループは,外側の $i$ に応じて $i$ 回だけ回る。よって加算回数は
$$ 1+2+3+4=10 $$
したがって出力は 10(イ)。
【キーワード:整数除算/while/桁数】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(div は整数除算を表す)
n ← 100
c ← 0
while n > 0 do
n ← n div 10
c ← c + 1
end while
print(c)
ウ
(テクノロジ系)
n div 10 により $n$ を 10 で割った整数に更新し,0 になるまで繰り返す。これは 桁数(digit count)を数える典型処理。
よって出力は 3(ウ)。
div を 10 で割るではなく 10 を引く等と混同)場合に出やすい。これは 整数除算(div)の説明ではなく 減算ループの誤解に相当。【キーワード:文字列/連結/逆順】
次の擬似言語を実行したとき,出力される文字列として正しいものはどれか。
(文字列の添字は1から始まり,length(t) は文字数を返す)
t ← "abcd"
u ← ""
for i ← length(t) down to 1 do
u ← u + t[i]
end for
print(u)
イ
(テクノロジ系)
down to で末尾から先頭へ走査し,u ← u + t[i] で 文字列連結するので,文字列が逆順に構成される。
"abcd" の逆順は "dcba"。よって(イ)。
【キーワード:ビット演算/AND】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(& はビットごとの AND を表す)
a ← 12
b ← 10
print(a & b)
イ
(テクノロジ系)
12 と 10 を2進数で表す。
ビットごとの AND(両方が1のビットだけ1)なので,
$$ 1100_2\ &\ 1010_2 = 1000_2 $$
$1000_2=8$ よって 8(イ)。
【キーワード:配列/最大最小/平均】
次の擬似言語は,配列 a の要素から最大値と最小値を除いた残りの平均値を求める処理である。出力される値として正しいものはどれか。
(割り算は実数の割り算とし,小数が出る場合はそのまま出力する)
a ← [4, 8, 2, 6, 10]
max ← a[1]
min ← a[1]
sum ← 0
for i ← 1 to 5 do
sum ← sum + a[i]
if a[i] > max then
max ← a[i]
end if
if a[i] < min then
min ← a[i]
end if
end for
avg ← (sum - max - min) / 3
print(avg)
ウ
(テクノロジ系)
配列の合計は $4+8+2+6+10=30$,最大値は 10,最小値は 2。
除外後の合計は $30-10-2=18$。残り3要素の平均は
$$ avg=\frac{18}{3}=6 $$
よって 6(ウ)。
【キーワード:for/剰余/合計】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(for文の範囲は上限を含む)
x ← 0
for i ← 1 to 10 do
if i mod 2 = 0 then
x ← x + i
end if
end for
print(x)
ウ
(テクノロジ系)
i mod 2 = 0 は 偶数判定。よって 1~10 の偶数(2,4,6,8,10)だけを加算する。
$$ 2+4+6+8+10=30 $$
したがって 30(ウ)。
【キーワード:while/整数除算/回数カウント】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(div は整数除算を表す)
n ← 1000
c ← 0
while n > 0 do
n ← n div 2
c ← c + 1
end while
print(c)
ウ
(テクノロジ系)
n div 2 で $n$ を半分(切り捨て)にし,0 になるまでの 反復回数を数える。
更新を追う:
よって 10(ウ)。
n ≥ 0 と誤読した場合。これは 条件式の誤認に相当。【キーワード:配列/削除/左シフト】
次の擬似言語は,配列 a の pos 番目の要素を削除し,後続要素を左に1つずつ詰める処理である。出力される配列として正しいものはどれか。
(配列の添字は1から始まり,for文の範囲は上限を含む)
a ← [1, 2, 3, 4, 5]
pos ← 2
for i ← pos to 4 do
a[i] ← a[i + 1]
end for
a[5] ← 0
print(a[1], a[2], a[3], a[4], a[5])
ア
(テクノロジ系)
pos=2 を削除するため,i=2..4 で a[i] に a[i+1] を代入し,末尾は 0 を入れる(空きを表す)。
よって (1,3,4,5,0)(ア)。
【キーワード:再帰/階乗】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
function fact(n)
if n = 1 then
return 1
else
return n * fact(n - 1)
end if
end function
print(fact(4))
エ
(テクノロジ系)
これは 階乗を再帰で求める処理。$fact(4)$ は
$$ \begin{aligned} fact(4)&=4\cdot fact(3)\ fact(3)&=3\cdot fact(2)\ fact(2)&=2\cdot fact(1)\ fact(1)&=1 \end{aligned} $$
よって
$$ fact(4)=4\cdot3\cdot2\cdot1=24 $$
従って 24(エ)。
【キーワード:条件分岐/配列/カウンタ】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(配列の添字は1から始まり,for文の範囲は上限を含む)
a ← [1, 2, 3, 2, 1]
key ← 2
c ← 0
for i ← 1 to 5 do
if a[i] = key then
c ← c + 1
else
c ← c + 2
end if
end for
print(c)
ウ
(テクノロジ系)
a[i] が key(2)なら +1,それ以外は +2 を加算する カウンタ処理。
配列は [1,2,3,2,1]:
よって 8(ウ)。
a[i] ≥ key などと誤解して,3 を一致扱いにする等で増える場合。これは 比較演算子の取り違えに相当。【キーワード:for/条件分岐/代入】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(for文の範囲は上限を含む)
x ← 1
for i ← 1 to 5 do
if i ≤ 3 then
x ← x * (i + 1)
else
x ← x - i
end if
end for
print(x)
イ
(テクノロジ系)
$ i=1,\ldots,5 $ を順に追う。$i≤3$ の間は乗算,それ以降は減算。
よって 15(イ)。
【キーワード:ビットシフト/反復/条件分岐】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(<< 1 は1ビット左シフトであり,整数を2倍するものとする)
x ← 5
for i ← 1 to 3 do
x ← x << 1
if x > 20 then
x ← x - 3
end if
end for
print(x)
イ
(テクノロジ系)
x ← x << 1 は 2倍。各回の結果を追う。
よって 37(イ)。
【キーワード:2次元配列/添字/集計】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(配列の添字は1から始まる)
a ← [[1,2,3],
[4,5,6],
[7,8,9]]
s ← 0
for i ← 1 to 3 do
s ← s + a[i][i]
end for
print(s)
イ
(テクノロジ系)
a[i][i] は 主対角要素(左上→右下)。よって加算するのは 1,5,9。
$$ s=1+5+9=15 $$
したがって 15(イ)。
【キーワード:探索/break/最初の一致】
次の擬似言語を実行したとき,出力される pos の値として正しいものはどれか。
(配列の添字は1から始まる)
a ← [9, 7, 7, 2]
key ← 7
pos ← -1
for i ← 1 to 4 do
if a[i] = key then
pos ← i
break
end if
end for
print(pos)
イ
(テクノロジ系)
break により,最初に一致した時点でループを終了する。配列 [9,7,7,2] で key=7 は 2番目が最初の一致なので pos=2。よって 2(イ)。
break を見落とし,2回目の一致位置まで進んだと誤解した場合。これは 線形探索(最後の一致)の説明に近い。【キーワード:バブルソート/隣接交換/交換回数】
次の擬似言語は,配列 a に対して隣接要素の比較と交換を左から1回だけ行う(1パス)処理である。出力される swaps の値として正しいものはどれか。
(配列の添字は1から始まる)
a ← [3, 2, 1, 4]
swaps ← 0
for i ← 1 to 3 do
if a[i] > a[i + 1] then
swap(a[i], a[i + 1])
swaps ← swaps + 1
end if
end for
print(swaps)
イ
(テクノロジ系)
1パスのバブルソートは,隣接比較で大きい方を右へ送る。交換回数を追う。
初期:[3,2,1,4]
よって swaps は 2(イ)。
【キーワード:2次元配列/列の合計/反復】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(配列の添字は1から始まり,for文の範囲は上限を含む)
a ← [[2,5,1],
[4,3,6],
[7,8,9]]
s ← 0
for i ← 1 to 3 do
s ← s + a[i][2]
end for
print(s)
イ
(テクノロジ系)
a[i][2] は 第2列(5,3,8)を表す。よって
$$ s=5+3+8=16 $$
したがって 16(イ)。
【キーワード:ビット演算/XOR/排他的論理和】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(^ はビットごとの XOR(排他的論理和)を表す)
a ← 12
b ← 10
print(a ^ b)
ア
(テクノロジ系)
12 と 10 を2進数で表す。
XOR は「ビットが異なるとき1」なので,
$$ 1100_2\ \hat{}\ 1010_2 = 0110_2 $$
$0110_2=6$ ……ではなく,ここで ^ を XOR として扱うなら結果は 6 であるため正解は ア。よって解答を アに訂正する。
【キーワード:手続/引数/カウント】
次の擬似言語は,配列 a の中で値 v より大きい要素の個数を数える処理である。空欄 A に入る式として正しいものはどれか。
function countGreater(a, v)
c ← 0
for i ← 1 to length(a) do
if a[i] > v then
c ← A
end if
end for
return c
end function
a ← [3, 7, 2, 9, 7]
print(countGreater(a, 6))
イ
(テクノロジ系)
条件 a[i] > v を満たすたびに,個数カウンタ c を 1 増やす必要があるので A は c+1。
(参考:v=6 のとき 7,9,7 の3個が該当し,戻り値は 3 になる。)
【キーワード:ユークリッドの互除法/while/剰余】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(mod は剰余を表す)
a ← 48
b ← 18
while b ≠ 0 do
r ← a mod b
a ← b
b ← r
end while
print(a)
イ
(テクノロジ系)
これは ユークリッドの互除法で,$a$ と $b$ の 最大公約数(GCD)を求める。
手順:
よって出力は 6(イ)。
mod の結果を誤り,割り算の余り計算を取り違えた場合に出やすい。これは 剰余(mod)の計算ミスに相当。【キーワード:continue/条件分岐/合計】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(for文の範囲は上限を含む。continue は以降の処理を行わず次の反復に移る)
s ← 0
for i ← 1 to 6 do
if i mod 2 = 0 then
continue
end if
s ← s + i
end for
print(s)
イ
(テクノロジ系)
i mod 2 = 0 は偶数判定。偶数のとき continue で加算をスキップするので,足すのは奇数(1,3,5)のみ。
$$ s=1+3+5=9 $$
よって 9(イ)。
continue を break(中断)と混同した場合に出やすい。これは continue と break の違いの取り違えに相当。if や continue を見落として 全加算した場合。