配列操作とは(全体像)
配列は、同じ種類の箱を一列に並べたもの。配列操作は、その箱を番号で指定して、中身を読んだり書き換えたりすることをいう。たとえば「3番目の箱の中身を見る」「5番目に値を入れる」といった作業だ。
擬似言語でいちばん大事なのは、配列が1始まりだということ。先頭の箱は`arr[1]`で、`arr[0]`は使わない。C・Java・Pythonなど多くの言語は`arr[0]`が先頭なので、ここを取り違えると番号が1つズレてしまう。
配列全体をまとめて処理したいときは、forループで1つずつ順に書く。Pythonのように「配列ぜんぶを一括で2倍」といった書き方はせず、1番から順にたどるのが擬似言語のやり方だ。
詳しく:操作のパターンだけ覚えれば戦える
ここが記事の心臓部。配列操作は、次のパターンで全部まかなえる。
配列操作の基本パターン
| 操作 | 書き方 | 意味 |
|---|---|---|
| 読む(アクセス) | `arr[i]` | i番目の箱の中身を取り出す(先頭は`arr[1]`) |
| 書く(代入) | `arr[i] ← 値` | i番目の箱に値を入れる |
| 個数を知る | `配列の要素数` | 箱がいくつあるかを返す |
| 2次元 | `mat[i, j]` | 表のi行j列の箱(`mat[1, 1]`が左上) |
配列ぜんぶを順にたどる書き方を走査といい、forループで書く。
走査(全要素を順に処理)の型
| 部分 | 書き方 |
|---|---|
| ループの開始 | `for i ← 1 to 配列の要素数 do` |
| 中の処理 | `arr[i] ← arr[i] × 2` (例:全要素を2倍) |
| ループの終わり | `endfor` |
つまり「1番から最後の番号まで、`i`を1ずつ増やしながら、`arr[i]`を順に処理する」という形。たとえばクラス全員の点数に5点ずつ足すなら、この型で全部の箱に+5すればいい、というわけだね。
2次元配列は`mat[i, j]`とカンマで区切り、i行j列の箱を指す。`mat[1, 1]`が左上、`mat[3, 3]`なら3行3列の表の右下にあたる。
わかりやすく言い換えると
要するに、配列操作は「番号つきの引き出しを開け閉めする」イメージだ。
①読む … 「3番の引き出しの中身を見る」=`arr[3]`
②書く … 「3番の引き出しに入れ直す」=`arr[3] ← 値`
③走査 … 「1番から順に全部の引き出しを開けて作業する」=forループ
ふつうの言語のクセ(0番から)のまま読むと1つズレる。だから「引き出しは1番から」と切り替えるのがコツ、というわけだね。
試験のツボ
🔴 一番出る:配列は1始まり
①先頭は`arr[1]`(`arr[0]`は使わない)
②C・Java・Pythonの0始まりと取り違えない
🔴 次に出る:走査はforループで1番から
①`for i ← 1 to 配列の要素数 do … endfor`の型
②`arr[i]`を1つずつ順に処理する
🟡 押さえると安定:2次元配列と要素数
①2次元は`mat[i, j]`(行が先・列が後)
②個数は`配列の要素数`で取る(`.length`ではない)
よくある間違い
①「配列の先頭は`arr[0]`である」→ ✗ 擬似言語は1始まり。先頭は`arr[1]`。
②「要素数は`arr.length`で取る」→ ✗ 擬似言語では`配列の要素数`と書く。`.length`は他言語の書き方。
③「2次元配列は`mat[j, i]`の順で列・行を書く」→ ✗ `mat[i, j]`の順で、行が先・列が後。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(配列のインデックス)
擬似言語の配列のインデックスに関する次の記述のうち、正しいものはどれか。
- 配列は0始まりで、先頭の要素はつねにarr[0]として読み書きするものとされている
- 配列は1始まりで、先頭の要素はarr[1]、2番目の要素はarr[2]として読み書きする
- 配列には番号で位置を指すという考え方そのものがいっさいなく、要素を取り出すことはできない
- 配列のインデックスは負の数から始まり、先頭の要素はarr[-1]で表されるとされている
解答は 2 だよ。
擬似言語の配列は1始まり。先頭は`arr[1]`、2番目は`arr[2]`なんだ。C・Java・Pythonは0始まり(`arr[0]`が先頭)だから、ここで切り替えてね。
選択肢1の「0始まり」はふつうの言語の話。選択肢3の「番号がない」、選択肢4の「負の数から」も誤りだよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 0始まりはふつうの言語 |
| 2 | ✓ | 1始まりで先頭はarr[1] |
| 3 | ✗ | 番号で各要素を指定できる |
| 4 | ✗ | 先頭はarr[1]で負の数ではない |
オリジナル問題2(要素数と代入)
擬似言語の配列の要素数と代入に関する次の記述のうち、正しいものはどれか。
- 配列の要素数はarr.lengthで取り出し、代入はarr.put(i,値)で行うとされている
- 配列の要素数は数えることができず、要素への代入もいっさいできないと決められている
- 配列の要素数は「配列の要素数」で取り、i番目への代入は「arr[i] ← 値」と書く
- 配列の要素数はcount(arr)で取り出し、代入はarr[i] = 値と等号で書くとされる
解答は 3 だよ。
擬似言語では、個数は`配列の要素数`で取り、i番目への代入は`arr[i] ← 値`(矢印)と書くんだ。代入は等号ではなく矢印だよ。
選択肢1の`.length`や選択肢4の`count()`・等号は他言語の書き方。選択肢2の「数えられない」も誤りだよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | `.length`や`.put`は他言語の書き方 |
| 2 | ✗ | 要素数も取れ、代入もできる |
| 3 | ✓ | `配列の要素数`と`arr[i] ← 値` |
| 4 | ✗ | 代入は矢印で、等号ではない |
オリジナル問題3(走査と2次元配列)
擬似言語の配列の走査と2次元配列に関する次の記述のうち、正しいものはどれか。
- 走査は「for i ← 1 to 要素数 do」と書き、2次元はmat[i, j]で指す
- 走査という考え方はなく、配列ぜんたいは「arr × 2」のように一括でしか操作できない
- 走査は0番から始めるという決まりで、2次元配列はmat[j, i]と列を先に書くものとされている
- 走査は最後の要素から先頭へ向かってのみ進み、途中にある要素は飛ばすことになっている
解答は 1 だよ。
走査は`for i ← 1 to 配列の要素数 do … endfor`の型で、1番から順にたどるんだ。2次元配列は`mat[i, j]`で、行が先・列が後だよ。
選択肢2の「一括操作だけ」、選択肢3の「0番から・列を先」、選択肢4の「最後から飛ばす」はどれも誤りだよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | forで1番から走査・2次元はmat[i, j] |
| 2 | ✗ | 一括操作はなくループで書く |
| 3 | ✗ | 1番から・行が先 |
| 4 | ✗ | 先頭から順にたどるのが基本 |
まとめ
押さえどころ
- 🔴 配列は1始まり = 先頭は`arr[1]`。0始まりのふつうの言語と取り違えない。
- 🔴 走査はforループ = `for i ← 1 to 配列の要素数 do … endfor`で1番から順に。
- 🟡 2次元と要素数 = 2次元は`mat[i, j]`(行が先・列が後)、個数は`配列の要素数`。
次に学ぶ
- 擬似言語の変数宣言 ── 配列を使う前の「箱の用意」。`整数型の配列: arr[1..10]`という宣言と合わせて押さえると流れがつながる。
- IPA擬似言語構文 ── 擬似言語ぜんたいの記法ルール。代入の`←`や1始まりの考え方の土台。
執筆: SikakuQuest編集部