Jasmine Teaで配列!

この記事は、 [Jasmine Tea アドベントカレンダー 2023](https://qiita.com/advent-calendar/2023/jasminetea) の第15日目です。

# はじめに

[Jasmine Tea](https://jasminetea.app) (ジャスミンティー) は、プログラミングの楽しさを多くの人に知ってもらうために作られたプログラミング言語です。初心者が学びやすい仕組みで、実際に社会で使われている多くのプログラミング言語に応用できる基礎が身に付きます。

ここでは、Jasmine Teaを実際に開いて、実行画面をクリックしたりタップしたときに反応するプログラムの作り方を紹介したいと思います。

まず、Studio 画面を開いてください。もし Studio 画面をまだ開いたことがなければ、 [Studio画面を表示する - Jasmine TeaでHello, world!](https://qiita.com/yoichiro6642/items/3dc478726f4f73941b46#studio%E7%94%BB%E9%9D%A2%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B) を参考にして Jasmine Tea の試用を開始してください。

# 多くの情報を扱いたいときがある

プログラムで扱うことになる情報は、ある数値や、ある文字列が基本です。

* 数値 - `123`, `0`, `-3459`, `3.14159263` など
* 文字列 - `Yoichiro`, `Jasmine Tea` など

プログラムの実行時に、数値や文字列を一時的に名前をつけて記憶しておくための箱、すなわち「変数」について、[Jasmine Teaで変数を使う!](https://qiita.com/yoichiro6642/items/37e01c68f534b9da3bcb) で紹介しました。以下のように使うことができます。

```vb
arithmetic=61
science=75
sum=arithmetic+science
print sum // 136

first_name$="Yoichiro"
last_name$="Tanaka"
name$=first_name$+" "+last_name$
print name$ // "Yoichiro Tanaka"
```

上記のプログラムは、算数と理科の点数の合計点と、生徒の名前を姓名から連結して求めている例です。つまり、生徒一人分の情報が各変数に入っています。

ルールとして、変数1つにつき、1つの情報を記憶しておくことができます。このルールから、以下の疑問が湧いてきませんか？

「生徒全員の名前や点数をプログラムで計算したいときって、変数どうするんだろう？」

例えば、生徒が全員で 100 人いたとすると、「`science1`, `science2`, ... と変数 100 個もつくるの？」となってしまいそうです。100 人分の理科の点数の平均点を出すプログラムをそれで書こうとすると、

```vb
science1=64
science2=40
// science3...science99
science100=94
average=(science1+science2+science3+science4+science5+science6+science7+science8+science9+science10+science11+science12+science13+science14+science15+science16+science17+science18+science19+science20+...+science100)/100
```

というプログラムになってしまいそうです。上記は5行ですが、実際には 101 行のプログラムになります。算数も同じことをしようとすると、202 行のプログラムになります。平均点を出すための式は、`science` が 100 個並びます。

「プログラミングってめちゃくちゃ面倒だな、こんなんじゃ役に立たない」って思う必要はありません。「100 人分の生徒の理科の点数」といった多くの情報を効率よく処理するための仕組みがあります。

# 配列を使って多くの情報を記憶しよう

Jasmine Tea では、多くの情報を扱うための仕組みとして「配列」という機能を提供しています。数列のようなもの、と考えればイメージしやすいかなと思います。

ここでは、中学校3年間で行われた期末テストの算数の点数を扱うプログラムを考えてみましょう。期末テストは1年間で3回行われますので、3年間で全9回行われます。

Jasmine Tea では、数値や文字列を `,` 記号で区切って、全体を `[` 記号と `]` 記号で囲むと、配列になります。具体例を見てみましょう。

```vb
science_score@=[80,59,95,99,64,80,74,61,93]
```

期末テストの1回目の点数が `80`, 2回目が `59`、というように、点数を `,` 記号区切りで並べています。そして `=` を使って、変数 `science_score@` に代入しています。Jasmine Tea では、配列を代入する変数には、その変数の名前の後ろに `@` 記号をつけるルールとなっています。

1つの変数には1つの情報しか代入できないのですが、配列が1つの情報と見なされますので、変数に代入することが可能です。

# 配列から情報を取り出そう

変数 `science_score@` には、配列の中に9個の数値が記憶されています。それぞれの点数を取り出すには、変数名の後ろに `[n]` を書きます。 `n` は、何番目を取り出したいかを示す番号（添字といいます）です。添字は `0` から始まります。つまり、配列の中の最初（ここでは `80`）の情報を取り出すには、以下のように書きます。

```vb
first_score=science_score@[0]
print first_score // 80
```

配列を取り出すときに指定する `n` は、`0` や `3` などの具体的な数字を書くこともできますが、実際には式を書くことになります。[`for` 命令](https://jasminetea.app/docs/references/command-for) のループ変数と組み合わせることで、配列の中から情報を次々と取り出すことができます。

では、Studio 画面のエディターに、以下のプログラムを入力してください。

```vb
science_score@=[80,59,95,99,64,80,74,61,93]
for i=0 to len(science_score@)-1
  print science_score@[i]
next
```

`for` 命令のパラメーターにて、ループ変数 `i` の最初の数として `0` を、最後の数として `len(science_score@)-1` を指定しています。[`len` 関数](https://jasminetea.app/docs/references/function-len) は、配列の中に入っている情報の個数を返してくれる関数です。今回の変数 `science_score@` に代入されている配列には、9個の数が入っていますので、`len` 関数の戻り値は `9` です。

![Screenshot_20231215_111640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632303/edc675c1-4cc8-6c99-3364-5bddd086738d.png)

配列の添字は `0` から始まります。そのため、配列の最後の添字は「配列に入っている情報の個数から 1 を引いた数」となります。今回の場合は `8` になります。つまり、配列の個数を `len(science_score@)` で求めて、そこから 1 だけ引いた数を `for` 命令の最後の数とすることで、全ての情報を配列から取り出すことができます。

では、実際にプログラムを実行してみましょう。青色の「実行」ボタンを押して、プログラムを実行してください。

![Screenshot_20231215_112016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632303/0b48003f-81be-0b77-f586-71851dddcbc7.png)

配列の中に入っている理科の点数が全て表示されました。

# 合計と平均点を求めてみよう

変数 `science_score@` に代入されている理科の点数を次々と取り出すことができるようになったら、それらに基づいていろいろな計算ができるようになります。では、理科の点数の合計点と、平均点を求めてみましょう。

エディターの1行目に、以下のプログラムを入力してください。

```vb
sum=0
```

エディター内の4行目を、以下のプログラムに変更してください。

```vb
  sum=sum+science_score@[i]
```

そして、6行目から以下のプログラムを追加してください。

```vb
print "合計:";sum
print "平均:";sum/len(science_score@)
```

エディターには以下のようにプログラムが入力されているかと思います。

![Screenshot_20231215_113405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632303/d9c86ae6-d865-7022-bd2f-8cb29671c929.png)

変数 `sum` に `0` を代入しておきます。そして、4行目の `sum=sum+science_score@[i]` は、以下のような処理となります。

1. 変数 `sum` に代入されている数と、変数 `i` に代入されている数を添字として変数 `science_score@` に代入されている配列から数を取り出して、足す。
1. 足し算の結果の数を、変数 `sum` に代入する。

上記を繰り返すことで、点数の合計を計算することができます。そして、変数 `sum` に代入されている合計点を変数 `science_score@` に代入されている配列の個数で割ることで、平均点を計算しています。

では、実行してみましょう。「実行」ボタンを押して、プログラムを実行してください。

![Screenshot_20231215_113824.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632303/c26d14f3-0c75-cff7-c1f8-4e5753aebfb7.png)

中学校3年間の理科の平均点は、約78点でした。まあまあ、ですね。

ちなみに、[`print` 命令](https://jasminetea.app/docs/references/command-print) のパラメーターには表示したい数や文字列を指定しますが、「;」記号を使って、複数の情報を並べて表示することができます。上記のプログラムでは、`print "合計:";sum` とすることで、`合計:` という文字列と、変数 `sum` に代入されている数を並べてテキスト画面に表示しています。

# 明日は何をつくるの？

明日は、ちょっと実践的なプログラミングのテクニックを紹介する予定です。シューティングゲームでありがちな「ビームを発射する」プログラムを作ってみたいと考えています。