配列
変数は、数値や文字列をコンピューターに一時的に記憶しておく仕組みです。変数1つにつき、数値や文字列を1つ記憶することができます。変数には名前を付けて、どんな情報が記憶されているかを識別します。
配列の仕組み
ここで例として「学籍番号0〜4の5人の生徒の国語のテスト点数」を記憶したいときのことを考えてみましょう。
学籍番号 | 国語 |
---|---|
0 | 100 |
1 | 74 |
2 | 98 |
3 | 82 |
4 | 90 |
全部で5個の点数を記憶しておくことが必要です。変数を使って、以下のように記憶しておくことができます。
- student0japanese, student1japanese, …, student4japanese
このように、全て名前が異なる変数を5個準備することになります。しかし、生徒が100人いたとすると、変数の数は100個にもなってしまいます。名前が全て異なる100個の変数それぞれに対してプログラムを書くことは、現実的ではありません。
個数が多い情報を扱いやすくするために、Jasmine Tea では「配列」と呼ばれる仕組みを提供しています。配列とは、多くの数値や文字列を1つの変数で扱うことができる仕組みです。
配列変数
配列を使うことで、例えば生徒たちの点数を score@ という一つの変数で扱うことができます。配列を扱う変数には、名前の後ろに「@」(アットマーク記号)をつけます。そして、学籍番号 0 の「一人目の国語の点数」は、scores@[0] というように、変数名の後ろに括弧付きの番号を付けます。二人目の国語の点数は、scores@[1] となります。
括弧の中の数字は、「添字」と呼びます。添字は、0 から 1, 2, 3, … と順に 1 ずつ増えていきます。例えば、100人目の生徒の国語の点数は、scores@[99] となります。
配列の名前は、数値や文字列を1つだけ持つことができる変数の名前の最後に「@」をつけます。
- scores@, _ages@, scores_2022@, names@, _lists@, names_2022@
配列リテラル
配列の仕組みを使用したいときは、配列リテラル(大括弧 [...])を使って配列を作ります。そして、作られた配列を変数に代入します。
scores@=[]
上記のように大括弧の中に何も書かなかったときは、scores@ 配列の中の要素数は 0 個となります。
もし既に配列に入れたい数値が決まっているときは、以下のようにすることで、予め対応する数値を持つ配列を作ることができます。
scores@=[100,74,98,82,90]
上記の場合、scores@[2] の結果は、98 となります。
多次元配列
ここで別の例を考えてみます。記憶したい点数の科目について、国語だけでなく算数と英語も生徒ごとに点数を記憶したくなりました。
学籍番号 | 国語 | 算数 | 英語 |
---|---|---|---|
0 | 100 | 73 | 82 |
1 | 74 | 77 | 58 |
2 | 98 | 62 | 93 |
3 | 82 | 80 | 91 |
4 | 90 | 86 | 77 |
この場合にも、一つの配列で全てを記憶することができます。上記の例では、生徒が5名で、それぞれ3科目分の点数を記憶することが必要です。このように数値を決定するための要素が2つあるときは、「2次元である」といいます。配列の各要素に更に配列が入っている、ということになります。
scores@=[[100,73,82],[74,77,58],[98,62,93],[82,80,91],[90,86,77]]
これにより、生徒ごとに各科目の点数を、以下のように記憶することができるようになります。
学籍番号 | 国語 = 0 | 算数 = 1 | 英語 = 2 |
---|---|---|---|
0 | score@[0][0] | score@[0][1] | score@[0][2] |
1 | score@[1][0] | score@[1][1] | score@[1][2] |
2 | score@[2][0] | score@[2][1] | score@[2][2] |
3 | score@[3][0] | score@[3][1] | score@[3][2] |
4 | score@[4][0] | score@[4][1] | score@[4][2] |
学籍番号 3 の生徒の英語の点数を知りたければ、scores@[3][2] とすれば取り出すことができます。
配列の個数や次元数については、数値が許す範囲内で制限がありません。また、配列の中に、数値と文字列、配列を混在させることができます。
scores@=[3,"Math",["Yoichiro",98],["Taro",73],["Hanako",88]]
配列を使うことで、ある情報のまとまりを上記のように柔軟に扱うことができるようになります。
配列に関するエラー
何も配列リテラルで配列が代入されていない配列変数を使おうとすると、エラーとなります。
name=name_list@[2] // name_list@ に何も配列が代入されていないのでエラー
また、数値や文字列、配列が何も代入されていない要素を使おうとしたときも、エラーとなります。
scores@=[3,"Math",["Yoichiro",98],["Taro",73],["Hanako",88]]
print scores@[5] // 添字5の要素には何も値が代入されていないのでエラー
要素の種類を求める関数
配列の各要素に何が入っているかをプログラムの実行中に確認するために、elemtype 関数が提供されています。
a@=[123,"abc",[4,5]]
print elemtype(a@,0) // 1(数値)
print elemtype(a@,1) // 2(文字列)
print elemtype(a@,2) // 3(配列)
print elemtype(a@,3) // 0(何も代入されていない)
状況に応じて配列の内容を変化させたいときは、elemtype 関数を使うことで条件分岐するプログラムを作ると良いでしょう。
配列の連結
「+」演算子を使って、2つの配列を連結させることができます。
subjects@=["Math","Science"]+["Social"]
print subjects@ // [Math,Science,Social]
math_scores@=[["Yoichiro",98],["Taro",73]]
math_scores@=math_scores@+[["Hanako",88]]
print math_scores@ // [[Yoichiro,98],[Taro,73],[Hanako,88]]
配列の比較
また、「=」演算子や「<>」演算子を使って、2つの配列の内容が等しいかどうかを確認することができます。
yoichiro_scores@=["Math",89]
taro_scores@=["Math",89]
hanako_scores@=["Math",34]
if yoichiro_scores@=taro_scores@ then
print "Yoichiro's score is same as Taro's score"
end if
if yoichiro_scores@<>hanako_scores@ then
print "Yoichiro's score is not same as Hanako's score"
end if
// どちらも出力される