メインコンテンツへスキップ
見出し画像

【基本情報】科目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] - 1

    1つ目の代入では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] ← temp

    tempへ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
    endfor

    maxは−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サンプル問題で確認できます。

    シリーズを順番に学ぶ

    あなたへのおすすめ