擬似言語の配列と添字がわからない人へ|要素数・二次元配列の読み方を解説
擬似言語の配列で、いま何番目を見ているのか分からなくなる。
問題を解いていて、添字のところで手が止まっていませんか?
配列そのものは、実は難しい仕組みではありません。難しいのは、番号を頭の中だけで数え続けることです。
私はエンジニアとして10年以上、Webシステムの開発や運用に携わってきました。実務でも配列の位置を一つ間違えただけで、一覧の最後の一件だけが表示されない、といった不具合になります。
つまり、添字のずれはプロでも起こすものです。だからこそ、感覚ではなく手順で確認する癖をつければ、それだけで科目Bの正答率は上がります。
この記事では、添字と要素数の関係、ループの範囲がずれる理由、二次元配列の読み方までを順番に見ていきます。
擬似言語の配列とは何か¶
配列は、同じ種類のデータをまとめて置いておくための入れ物です。値そのものではなく、値が入った箱が横に並んでいる様子を思い浮かべてください。
そして、それぞれの箱には番号が振られています。この番号のことを添字と呼びます。
添字は何番から始まるのか¶
ここが最初のつまずきどころです。添字は1から始まる場合もあれば、0から始まる場合もあります。
覚えようとしなくて大丈夫です。試験では、問題文や擬似言語の記述形式の説明に、必ずどちらなのかが書かれています。
私が受験生に伝えているのは、解き始める前にその一文を指でなぞって確認する、という単純な作業です。ここを確認しないまま読み進めると、答えが一つずれたまま最後まで気づけません。
たとえば要素数が5の配列で、添字が1から始まる場合と0から始まる場合を並べると、違いがはっきりします。
| 内容 | 添字が1から始まる | 添字が0から始まる |
|---|---|---|
| 最初の要素 | data[1] | data[0] |
| 2番目の要素 | data[2] | data[1] |
| 最後の要素 | data[5] | data[4] |
| 最後の添字 | 要素数と同じ | 要素数 − 1 |
表の右下に注目してください。添字が0から始まるとき、最後の添字は要素数より1小さくなります。
この一行を見落とすことが、配列問題での失点の大半を占めます。逆に言えば、ここさえ押さえれば大きく崩れません。
要素数と添字は別のもの¶
要素数は箱がいくつあるかを表す数で、添字は何番目の箱かを表す数です。似ているようで、役割はまったく違います。
擬似言語では、配列の長さを data の要素数 のように書き表します。ループの終わりを決めるときに、この値をそのまま使ってよいのか、1を引くのかで結果が変わります。
擬似言語の記号や書き方そのものに不安が残っている場合は、先に全体像をつかんでおくと理解が早くなります。
【関連記事】擬似言語とは?IT初心者にもわかる意味・書き方・プログラミングとの違いをやさしく解説
擬似言語のコードで配列を追ってみる¶
言葉の説明だけでは、なかなか手が動くようにはなりません。実際のコードを一行ずつ追ってみましょう。
次は、配列に入っている整数をすべて足し合わせて、合計を返す手続です。
○整数型: goukei(整数型の配列: data)
整数型: sum ← 0
整数型: i
for (i を 1 から data の要素数 まで 1 ずつ増やす)
sum ← sum + data[i]
endfor
return sum
読むポイントは、i がどの値を取りながら進むかです。i は1から始まり、要素数と同じ値になるまで1つずつ増えていきます。
data が {4, 7, 2} だとして、変数の中身を表にしてみます。これがトレース表と呼ばれるものです。
| ループの回数 | i の値 | data[i] | 加算後の sum |
|---|---|---|---|
| 開始前 | ― | ― | 0 |
| 1回目 | 1 | 4 | 4 |
| 2回目 | 2 | 7 | 11 |
| 3回目 | 3 | 2 | 13 |
答えは13です。頭の中で計算せず、こうして書き出すだけで、間違いはぐっと減ります。
トレース表を書くのは遠回りに見えるかもしれません。ですが実際には、書いた人のほうが速く正解にたどり着きます。
繰返し処理そのものの読み方に不安がある場合は、for と while の違いを整理しておくと、この表がもっと書きやすくなります。
【関連記事】擬似言語のwhileとforってどう違う?繰返し処理で迷子にならない方法を詳しく解説
添字がずれる、よくある3つの場面¶
配列の問題で答えを落とすとき、原因はだいたい決まっています。私がこれまで見てきた中で多いものを、順番に見ていきましょう。
場面1:ループの終わりが1つ多い、または1つ少ない¶
添字が0から始まる配列に対して、1から要素数までループを回してしまう。これが一番多い失敗です。
このとき最後の要素が読まれず、代わりに存在しない箱を見にいってしまいます。答えが少しだけ合わない、という嫌な外れ方をします。
反対に、添字が1から始まるのに0から回してしまう場合もあります。どちらも、開始と終了をセットで確認すれば防げます。
場面2:隣の要素と比べるときにはみ出す¶
並べ替えや、隣同士を比較する問題でよく起こります。data[i] と data[i + 1] を比べるとき、i が最後まで進むと i + 1 が配列の外に出てしまうからです。
だから、この種のループは要素数より1つ手前で止めます。式の中に i + 1 や i − 1 が出てきたら、ループの範囲を必ず見直してください。
場面3:添字そのものが計算式になっている¶
data[i × 2] や data[n − i + 1] のように、添字が式で書かれている問題もあります。ここで焦る必要はありません。
やることは同じで、i に具体的な数を入れて、添字がいくつになるかを一度書き出すだけです。式のまま考えようとすると、途端に難しく感じます。
こうしたずれは、注意力ではなく手順で防ぐものです。同じ悩みを別の角度から扱った記事もあります。
【関連記事】擬似言語でケアレスミスが多い人へ|よくある間違いと確認方法
二次元配列は表だと思えばいい¶
科目Bでは、二次元配列が出てくることもあります。名前だけは少し難しそうに見えますが、正体は単なる表です。
行と列があって、行番号と列番号の2つで場所を指定します。座席表を思い浮かべると分かりやすいでしょう。
擬似言語では、次のように書きます。
整数型の二次元配列: hyou ← {{1, 2, 3},
{4, 5, 6}}
/* hyou[1, 2] は 1行目の2列目なので 2 */
/* hyou[2, 3] は 2行目の3列目なので 6 */
大かっこの中の1つ目が行、2つ目が列です。この順番を逆に読むと、まったく違う値を拾ってしまいます。
二次元配列では、ループが二重になることがほとんどです。外側のループで行を動かし、内側のループで列を動かす、という形が基本になります。
内側のループが一周し終わってから、外側の値が1つ増えます。この動きさえつかめば、二重ループも怖くありません。
言葉だけだと分かりにくいので、二重ループの形も見ておきましょう。
整数型: gyou, retsu
for (gyou を 1 から 2 まで 1 ずつ増やす)
for (retsu を 1 から 3 まで 1 ずつ増やす)
hyou[gyou, retsu] を出力する
endfor
endfor
このとき値が出てくる順番は、1行目を左から右へ、それが終わってから2行目を左から右へ、となります。行が変わるのは、内側のループが一周し終わったあとだけです。
添字の組み合わせを順番に並べると、動きがはっきりします。
| 出力の順番 | gyou | retsu | 出力される値 |
|---|---|---|---|
| 1番目 | 1 | 1 | 1 |
| 2番目 | 1 | 2 | 2 |
| 3番目 | 1 | 3 | 3 |
| 4番目 | 2 | 1 | 4 |
| 5番目 | 2 | 2 | 5 |
| 6番目 | 2 | 3 | 6 |
外側の gyou がゆっくり、内側の retsu が速く動いていますね。二重ループは、この速さの違いさえつかめば読めます。
迷ったときは、実際に小さな表を紙に書いて、指で追ってください。行を先に決めて、それから列を横になぞる。この動作を体で覚えるのが近道です。
配列と添字が主役になる問題を読んでみる¶
配列が出てくる問題は、合計を求めるものばかりではありません。探しものをする処理でも、添字が主役になります。
次は、配列の中から目的の値を探して、見つかった位置を返す手続です。線形探索と呼ばれる、もっとも基本的な形になります。
○整数型: sagasu(整数型の配列: data, 整数型: target)
整数型: i
for (i を 1 から data の要素数 まで 1 ずつ増やす)
if (data[i] = target)
return i
endif
endfor
return -1
注目してほしいのは、返しているのが値そのものではなく i だという点です。つまり、何が見つかったかではなく、何番目にあったかを答えています。
そして最後の行の -1 にも意味があります。最後まで回しても見つからなかったことを、添字としてありえない値で知らせているのです。
配列の添字が1から始まるなら、0 や -1 は絶対に出てこない番号です。だから、見つからなかったという合図に使えます。
こういう決まりごとは、実務のプログラムでもよく出てきます。私も、返ってきた値が位置なのか中身なのかを取り違えて、原因を探すのに時間を使ったことがあります。
途中で抜けるループは、最後まで回らない¶
この手続では、目的の値が見つかった時点で return によって処理が終わります。残りの要素は読まれません。
ここを見落とすと、ループが最後まで回った前提でトレース表を作ってしまいます。返る場所がループの中にあるかどうかは、必ず確認してください。
試験本番で使える確認の手順¶
科目Bは全20問を100分で解く試験です。時間に余裕があるとは言えませんが、配列の確認そのものは数秒で終わります。
私が勧めているのは、次の3つを解き始める前に済ませてしまうやり方です。
| 確認すること | 見る場所 | かかる時間 |
|---|---|---|
| 添字は何番から始まるか | 問題文・記述形式の注記 | 数秒 |
| 配列の要素数はいくつか | 初期値や問題文の説明 | 数秒 |
| ループの開始と終了の値 | for や while の行 | 十数秒 |
たったこれだけです。しかし、この3つを飛ばした状態で読み進めると、途中で必ず自信がなくなります。
そして、あやふやなまま選択肢を見ると、それらしい答えに引き寄せられてしまいます。先に土台を固めておくほうが、結局は速いのです。
擬似言語の記号や書き方をまとめて見直したいときは、早見表を手元に置いておくと安心できます。
【関連記事】擬似言語の記号・記述形式一覧|試験前のチェック早見表
手を動かして確かめるのが一番早い¶
読むだけで配列が分かるようになる人は、あまり多くありません。値がどう変わるかを目で見るのが、遠回りのようで一番の近道です。
Giji Academy の擬似言語シミュレーターでは、いま書いたようなコードを実際に動かして、変数の中身が1行ごとにどう変わるかを確かめられます。添字を1つずらすとどうなるかも、その場で試せます。
自分の手で壊してみると、なぜずれるのかが感覚として残ります。よかったら学習ページからのぞいてみてください。
間違えたときこそ記録する¶
添字のずれは、同じ人が同じ形で繰り返しがちです。だからこそ、間違えた形を短くメモしておくと効果があります。
要素数までループしてしまった、行と列を逆に読んだ。この程度の一行で十分です。
大事なのは、書いたメモを試験の直前に読み返すことです。自分がやりがちなずれを一度思い出してから解き始めるだけで、同じ失点はかなり減ります。
私も仕事では、過去に踏んだ不具合を短くまとめて残しています。人の記憶は思っているより頼りにならない、というのが十年やってきた実感です。
まとめ¶
擬似言語の配列でつまずく原因は、才能でも慣れでもありません。添字が何番から始まるか、要素数はいくつか、ループはどこで止まるか。この3点の確認を飛ばしてしまうことが、ほとんどすべてです。
そして、確認したあとはトレース表に書き出す。二次元配列なら、行と列の順番だけ間違えないようにする。
やることは驚くほど少ないと感じたのではないでしょうか。実際、配列は擬似言語の中でも仕組みがはっきりしていて、努力が点数に変わりやすい分野です。
今日から、問題を開いたらまず添字の始まりを確認してみてください。それだけで、いま何番目を見ているのか分からない、という迷いはきっと減っていきます。