
【基本情報】科目B 配列と添字の問題|位置・値・書き換えを区別する基礎演習
位置と値を区別できたら、書き換え後の配列で練習しましょう。 隣同士の交換を1周ずつ追う演習(全文無料)で、比較回数と交換回数を分けて確認できます。各比較の後に配列全体を書くと、更新前の値を使うミスを見つけやすくなります。
「data[3]は、3という値? それとも3番目?」「配列を書き換えたら、どの値を使えばいい?」
配列の問題では、位置を表す添字と、その場所の値を分けるだけで処理を追いやすくなります📚 今回は、読み出し・書き換え・交換・集計を、小さな配列で練習します。
1.今回の表記と前提
この記事の問題はIT資格攻略chのオリジナル基礎演習です。説明用に型宣言などを省いた擬似言語を使います。←は代入、=は比較、≠は「等しくない」を表します。forの終点は含みます。配列の要素番号は、特記がなければ1から始まります。公式問題では、その問題の定義と表記を確認してください。
配列の初期値は{8, 3, 6, 2}のように書きます。この記号は要素の並びを示します。今回の各問題で、配列は空ではありません。
2.添字は位置、data[i]はその位置の値

data[3]は3番目の値なので6です。要素数は4、最後の要素番号も4。今回のように1始まりなら「最後の番号=要素数」になります。
0始まりの定義なら、同じ4要素の番号は0〜3です。これは別のルールなので、問題の定義を優先してください。
data[i]を読むときは、「iは何番か」→「その場所には何が入っているか」の2段階で確認します。
3.変数が添字になる例
data ← {8, 3, 6, 2}
i ← 2
x ← data[i]
i ← i + 1
y ← data[i]xへ代入するときはi=2なので、x=3。次にiが3へ更新され、y=data[3]=6になります。
最後のiが3だからといって、先に代入したxまで6へ変わるわけではありません。xには、その時点で読み出した3が入っています。
4.書き換え後は新しい配列を使う
data ← {8, 3, 6, 2}
data[2] ← data[1] + data[4]
data[3] ← data[2] - 11つ目の代入では8+2=10なので、2番目が10に変わります。

2つ目では、更新されたdata[2]=10を使って10-1=9。初期値の3を使ってはいけません。
書き換わった場所を丸で囲むと、古い配列を見直してしまうミスを防ぎやすくなります。
5.交換は一時変数を使う
配列の2番目と4番目を入れ替えます。
data ← {8, 3, 6, 2}
temp ← data[2]
data[2] ← data[4]
data[4] ← temptempへ3を保存し、2番目へ2を入れ、4番目へ保存した3を戻します。結果は{8, 2, 6, 3}です。
tempを使わずにdata[2]←data[4]、data[4]←data[2]とすると、2番目も4番目も2になります。元の3が失われるためです。
ソートなどの交換処理でも、「上書き前の値をどこに残すか」を意識しましょう。
6.条件に合う要素だけを数える
data ← {4, 9, 2, 9, 5}
count ← 0
for (i を 1 から 5 まで 1 ずつ増やす)
if (data[i] が 5 以上)
count ← count + 1
endif
endfor

count=3。調べるのは添字iではなく値data[i]です。5も条件に含まれます。
countは該当した個数を数えています。値を合計するsum←sum+data[i]とは、更新する内容が違います。
7.最大値の初期値は最初の要素から
data ← {-8, -3, -6}
max ← data[1]
for (i を 2 から 3 まで 1 ずつ増やす)
if (data[i] が max より大きい)
max ← data[i]
endif
endformaxは−8から始まり、−3を見て更新され、−6では変わりません。答えは−3です。
max←0で始めると、負の数だけの配列では0が残ってしまいます。今回のような空でない配列の最大値探索なら、実際の要素を初期値にすると、この問題を避けられます。
「すべて非負」「必ず要素がある」などの前提も、初期化の判断に関係します。
8.範囲外を読まない
5要素、1始まりの配列で使える添字は1〜5です。data[0]やdata[6]を読み出す前提にはできません。
隣の要素data[i+1]を使うなら、i=5のときはdata[6]になってしまいます。隣接する2要素を比べる処理では、どこまでiを進めてよいか確認しましょう。
9.確認問題3問
問1 位置と値
data ← {5, 2, 4, 1}
i ← data[2]
x ← data[i + 1]最後のiとxを求めてください。
問2 連続する書き換え
data ← {2, 5, 7}
data[1] ← data[2]
data[2] ← data[1] + data[3]最後の配列を求めてください。
問3 隣接要素の比較
1始まり、5要素の配列でdata[i]とdata[i+1]を比べます。iを1から1ずつ増やすとき、範囲外を読まずに比較できる最後のiはいくつでしょうか?
10.解答と復習ポイント
問1:i=2、x=4。data[2]の値2がiに入り、i+1=3。data[3]を読むので4です。値を読んでから添字に使う、2段階の処理です。
問2:{5, 12, 7}。最初の代入でdata[1]は5になります。次は5+7=12をdata[2]へ代入します。
問3:i=4。data[4]とdata[5]までは比較できます。i=5だとdata[6]を読んでしまいます。
11.配列問題を解くときのチェック
要素番号の開始値を確認したか
添字と値を別々に書いたか
書き換え後の配列を使ったか
隣の要素を読む処理で範囲外にならないか
次は「for・while」の演習で、配列を読む回数と終了条件を確認しましょう。記事は基本情報の無料記事まとめから探せます。
さらに学ぶなら探索アルゴリズムとソートアルゴリズムへ。公式の表記はIPA 科目Bサンプル問題で確認できます。