07 配列(1次元)

繰り返しと配列は、切っても切れない関係にある。

コンピュータが最も得意なことの一つは、「大量の情報を、人間が音を上げるような速さで、順番に処理すること」です。
1000人分の成績を合計する、100万件のデータから最大値を探す——これを人間がやれば何時間もかかりますが、コンピュータなら一瞬です。

その「大量のデータ」をまとめて持つための仕組みが配列であり、「順番に処理する」ための仕組みが繰り返し(for文・while文)です。
この2つが組み合わさることで、コンピュータの真価が発揮されます。配列を学ぶことは、プログラミングの本質に一歩踏み込むことでもあります。

1. 配列とは

配列とは ── 同じデータ型のデータが複数並んだもの

配列は、同じ型のデータを複数まとめて管理する仕組みです。 たとえば5人の点数を管理したいとき、変数を5つ用意する代わりに配列1つで済みます。

変数を5つ用意する場合 score1 85 score2 72 score3 91 score4 68 score5 77 変数5個必要 配列を使う場合(scores) scores [1] 85 [2] 72 [3] 91 [4] 68 [5] 77 変数1個で管理

2. 宣言と初期化

宣言のみ

整数型の配列: scores

値をまとめて代入(初期化)

整数型の配列: scores
scores ← {85, 72, 91, 68, 77}

カンマで区切られた値が要素番号1番から順に代入されます。

scores ← {85, 72, 91, 68, 77} scores[1] 85 scores[2] 72 scores[3] 91 scores[4] 68 scores[5] 77
要素番号は0から始まる?1から始まる?
C言語やPythonなど多くの実際の言語では0から始まります。
IPAの擬似言語では、問題文中に「配列の要素番号は1から始まる」と明記されている場合はその指定に従います。
指定がない場合も、試験問題では1始まりの場合がほとんどです。必ず問題文を確認する習慣をつけましょう。

「先頭の要素番号」「末尾の要素番号」は、0始まり/1始まりで値が変わります。 特に末尾の要素番号を表すときに「要素数」と「要素数 − 1」のどちらを使うのか、混乱しやすいので整理しておきます。

0始まり(0オリジン) 1始まり(1オリジン)
要素数 5 5
先頭の要素番号 0 1
末尾の要素番号 4
要素数 − 1
5
要素数 と同じ
覚え方:「末尾の要素番号 = 先頭の要素番号 + 要素数 − 1」
0始まりなら 0 + 5 − 1 = 4、1始まりなら 1 + 5 − 1 = 5
for文の終了値に「要素数」を書くか「要素数 − 1」を書くかは、ここの違いから来ています。

3. 要素へのアクセス

配列名の後ろに [要素番号] を書いてアクセスします。

整数型の配列: scores ← {85, 72, 91, 68, 77}

// 参照(読み出し)
整数型: x ← scores[3]   // x に 91 が入る

// 代入(書き込み)
scores[2] ← 80           // scores[2] が 72 → 80 に変わる

4. 配列とfor文の組み合わせ

配列の全要素を処理するには、カウンタ変数を要素番号として使うのが定番パターンです。 これが配列とfor文を組み合わせる最大のメリットです。

scores [1] 85 [2] 72 [3] 91 [4] 68 [5] 77 i=1 i=2 i=3 … i=4, 5 と続く for ( i を 1 から 5 まで 1 ずつ増やす ) → scores[i] で各要素にアクセス

合計を求める例

整数型の配列: scores ← {85, 72, 91, 68, 77}
整数型: i
整数型: total ← 0

for ( i を 1 から 5 まで 1 ずつ増やす )
    total ← total + scores[i]
endfor

total を出力   // 出力:393

要素数を使う書き方(汎用的)

for ( i を 1 から scores の要素数 まで 1 ずつ増やす )
    total ← total + scores[i]
endfor
scores の要素数 と書くと、配列の長さが変わっても修正不要になります。 試験のプログラムでもこの書き方が頻繁に登場します。

5. 配列の要素の入れ替え

2変数の値の入れ替えと同じく、temp(一時変数)を使います。

整数型の配列: a ← {10, 20, 30}
整数型: temp

temp ← a[1]    // temp に 10 を退避
a[1] ← a[3]   // a[1] を 30 に上書き
a[3] ← temp   // a[3] を 10 に
// 結果:a = {30, 20, 10}

6. 範囲外アクセスに注意

存在しない要素番号を指定する「範囲外アクセス」は、基本的にエラーになってプログラムが停止します。

ただし言語によって扱いが異なります:
擬似言語の試験問題では範囲外アクセスが発生するような問題は出題されませんが、実際のプログラムを書く際は常に意識してください。

7. 末尾に要素を追加する

最初は空(要素数0)の配列を用意しておき、条件に合った要素を見つけたら配列の末尾に追加していくパターンは、 試験でもよく出題されます。

整数型の配列: result ← {}   // 要素数0の空配列
result の末尾に X の値を追加する

この操作によって result の要素数が1つ増え、追加した値が末尾の要素番号に入ります。

追加前 result(要素数 3) [1] 10 [2] 20 [3] 30 末尾に 99 を追加 追加後 result(要素数 4) [1] 10 [2] 20 [3] 30 [4] 99 ↑新しい末尾

例題:60点未満の生徒の番号を集める

scores 配列に5人の点数が入っているとき、不合格者(60点未満)の番号result 配列に集めるプログラム。

整数型の配列: scores ← {85, 50, 72, 40, 95}
整数型の配列: result ← {}   // 要素数0の空配列
整数型: i

for ( i を 1 から scores の要素数 まで 1 ずつ増やす )
    if ( scores[i] が 60 未満 )
        result の末尾に i の値を追加する
    endif
endfor
// 実行後:result = {2, 4}
追跡してみよう(result の中身がどう増えていくか):
iscores[i]60 未満?result
185×{ }
250○ → 2 を追加{ 2 }
372×{ 2 }
440○ → 4 を追加{ 2, 4 }
595×{ 2, 4 }
最終的に result = {2, 4}(2番目と4番目の生徒が不合格)になります。
IPA試験ではこのパターンが応用されて出題されます。
たとえば「配列 data から配列 key と同じ並びを全て探し、見つかった先頭の要素番号を全て返す」といった文字列検索の問題。 難しく見えても中身はこの「条件に合った要素番号を集める」パターンの延長です。

ポイントは2つ:

8. 理解度チェック問題

問題07-1

次のコードを実行すると x の値はいくつになるか。

整数型の配列: data ← {10, 20, 30, 40, 50}
整数型: x ← data[3]
解説を表示 正解:ウ
要素番号は1から始まります。data[3] は3番目の要素 30 です。

問題07-2

次のコードを実行すると total の値はいくつになるか。

整数型の配列: data ← {2, 4, 6, 8, 10}
整数型: i
整数型: total ← 0

for ( i を 1 から 5 まで 1 ずつ増やす )
    total ← total + data[i]
endfor
解説を表示 正解:エ
2 + 4 + 6 + 8 + 10 = 30

問題07-3

次のコードを実行した後の a[1]、a[2]、a[3] の値の組み合わせとして正しいものを選びなさい。

整数型の配列: a ← {1, 2, 3}
整数型: temp

temp ← a[1]
a[1] ← a[3]
a[3] ← temp
解説を表示 正解:イ
temp=1 → a[1]=3 → a[3]=1 の順に処理。a[2] は変わらず 2。結果:{3, 2, 1}

問題07-4 空欄補充

次のコードは配列の全要素を出力するプログラムである。空欄 [ A ] に入るものを選びなさい。

整数型の配列: nums ← {5, 10, 15, 20}
整数型: i

for ( i を 1 から [ A ] まで 1 ずつ増やす )
    nums[i] を出力
endfor
解説を表示 正解:ア
要素番号は1〜要素数までなので、終了値は「要素数」がちょうどよい値です。
+1 にすると存在しない要素番号にアクセスしてしまいます。

問題07-5

次のコードを実行すると max の値はいくつになるか。

整数型の配列: score ← {45, 72, 68, 91, 53}
整数型: i
整数型: max ← score[1]

for ( i を 2 から score の要素数 まで 1 ずつ増やす )
    if ( score[i] が max より大きい )
        max ← score[i]
    endif
endfor
解説を表示 正解:ウ
最初に max = score[1] = 45 で初期化し、全要素と比較しながら更新。最大値は 91。
これは「最大値探索」の定番アルゴリズムです。次の資料で詳しく学びます。