AREA 021
Featuring AlphaScript

STEP 8 配列

 

変数は、普通に宣言しただけだと単一の箱になりますが、複数個まとめて用意することも可能です。  これを「配列」(はいれつ)と呼びます。


やるだけやってみる

さて、いきなりですが演習問題です。  変数を100個用意して、それに1〜100までの数値を格納するスクリプトを書いてください。  大変そうですが・・・とにかくやってみることにします!  まずは変数100個を用意しなければなりません。

$ one;
$ two;
$ three;
$ four;
$ five;

・
・
・
(省略)
・
・
・

$ ninety_nine;
$ hundred;

何とかできました。 書けてなくても、書けたということにしてください。  次は1〜100までの数値を代入していきます。

one    = 1;
two    = 2;
three  = 3;
four   = 4;
five   = 5;

・
・
・
・

・・・このように、とても現実的な作業ではありません。(100個ならなんとかいけそう? じゃあ、100万個だったら・・・)  同じことを繰り返すのに、それをその回数だけ記述する必要はないです。  この問題のようなスクリプトでは、配列を使うのが有効です。


配列ってなに?

配列は、変数をいくつもまとめて扱うことができる機能で、 ジャンプと組み合わせることにより、プログラムの自由度を一気に高めてくれます。  実際に、配列を使ってさっきの問題を解いてみます。

$ number[100];


$ cnt;

cnt = 0;


@ loop;

number[cnt] = cnt+1;

cnt += 1; if: cnt < 100 { * loop; }

以上です。 変数を1つ1つ書いていくよりずっとラクですね。

変数宣言で、変数名の後に[ ]で囲んでその中に数字を書くと、変数をその個数だけまとめて用意できます。  例では、 number という名前の変数を一度に100個作っています。

その次にある変数 cnt とラベル loop によって、ループ(繰り返し)の構造を組み立てています。  この例だと、 cnt に1を加え、それが100より小さければジャンプで戻るようにしていますので、 ラベル loop との間にある処理が100回繰り返し実行されることになります。 ( if については、条件分岐で解説しています)

そして、繰り返される文の number[cnt] = cnt+1 で、 number の配列に1つずつ数値を格納しています。  配列名の後に[ ]を書き、その中に数値nをいれると、その配列のn番目の要素にアクセスできます。

number 配列は、100個の変数の集まりでしたが、これを要素数100の配列と呼びます。  そして、その number 配列が持っている要素は0番〜99番までです。  要素は0番からはじまりすので、要素数100個の配列なら、最後の要素は99番になります。 (100番目まであったら全部で101個になってしまいます)




配列の要素は、アクセスする方法が違うこと以外は通常の変数と同じように扱われます。  この各要素を使うための記述が ”変数名 [要素番号] ” という形になっているわけです。

ですから、例のループ構造の中で number[cnt] と書けば、number配列の0番目から99番目までの要素1つ1つに対して処理できるのです。  cnt+1 を代入するということは、ループが終わったときにはnumber配列の0番目〜99番目の要素に1〜100の数値が入っているはずです。


配列を扱うときの注意点

配列を参照する[ ]の中の要素番号が、要素数の範囲を超えていたらエラーになります。  先ほどの number 配列なら number[100] などと書いてしまった場合ですね。  要素番号にマイナス値を指定したときも同様です。 

これは、プログラムを実行するときに最も起こりやすいエラーかもしれません。  余談ですが、市販のソフトウェアがバグで止まってしまう原因としても、この配列の要素エラーが一番多いと思われます。


配列宣言の注意点

配列の宣言で指定する要素数は、必ず正の整数の固定値でなければなりません。  $ array[10*10] のように計算式は使えないので注意してください。 (ちなみに array というのは英語で配列のことです)


配列参照の注意点

配列の参照では[ ]の中に変数や計算式も記述できますが、 その数値が 0.5 などの小数になった場合、自動的に整数に変換して認識されます。  その際、小数点以下は切り捨てます。  なので、 array[0.5] と書けば、参照するのは0番の要素です。

配列の要素以外でも、整数でなければならない値を指定するときは、自動変換してくれます。  これは、 AlphaScript 特有の機能です。


実は・・・

実のところ、単体の変数と配列は、本質的には同じものです。  単体の変数と言うのは、実は要素数が1個の配列だったのです。

つまり、

$ abc  $ abc[1]

abc = 0  abc[0] = 0

は、それぞれ同じなのです。

ですが、1個の変数を使うときに後者の書き方をするのは無意味なので、忘れていただいてかまいません。(^^;  ただ、配列として使うときは、変数名を書くだけで要素の先頭(0番目の要素)を表す、ということを覚えておくとよいかと思います。  この配列の扱い方も AlphaScript 独自の仕様です。


便利な代入法

配列には、もうひとつ便利な使い方があります。 こんなふうに・・・。

array @ 2, 8, 4, 6 ;

この1文だけで、array[0]に2 、array[1]に8、array[2]に4、array[3]に6をそれぞれ代入できます。 (ラベル宣言の @ とは全く別物なので注意!)  最初の問題では順番に並んだ数字を代入すればよかったので、この方法は不要でしたが、 上記のように不規則な数字を代入したい場合は、要素1つずつに対して代入文を書かないといけないので面倒(しかも処理が遅い)です。  そのことから、この書き方がいかに有用であるかがおわかりいただけると思います。

また、次のように書いて要素の途中から代入できます。

array[2] @ 2, 8, 4, 6;

これで、 array[2]〜array[5] の各要素に 2,8,4,6 を代入できます。

なお、この書き方の場合も、配列を要素数より多くの要素を代入しようとしたり、要素番号がオーバーしていると、やっぱりエラーになります。


つなげる、つながる

先ほどの例で登場した書き方ですが、スクリプトの中に埋め込む値としての配列は , を使って連結することで表現できます。  ( 1, 2, 3, 4 ) のように書けば要素数 4 の配列になりますが、これを ( ( 1, 2 ), ( 3, 4 ) ) のように書くこともできます。

なんかこのあたりからわかりづらくなってくるかもしれませんが、はじめはそんなもんです。  サンプルを見ることによって、徐々にわかってくると思います。  作者だってプログラミング言語 Java を理解するのに(以下略


変数の有効範囲指定について

複数の要素を持つ変数を参照する際には、有効範囲を指定することができます。  有効範囲は、変数名の後ろに .(ピリオド) と数値を付けることで表現します。  例えば、 ary.5 のように書けば、ary の 0 番目の要素から 4 番目の要素までの配列を表します。  添え字と組み合わせて ary[2].3 のように書けば、ary の 2 番目の要素から 4 番目の要素までの配列になります。  これを使って、配列の特定の部分だけを取り出して連結したりできます。  範囲指定を付けなかった変数は、有効範囲が 1 の配列として扱われていたわけですね。

なお、. の後の有効範囲として認識されるのは、ひとつの項だけです。  有効範囲に計算式などを付けようとして

ary.3+5

のように書くと「ary.3 に 5 を加える」という意味になってしまいます。 正しくは、以下のように書いてください。

ary.(3+5)



しかし、各章の長さが全く統一できてませんね...。  今後文章を書くときの課題です。。

 

ページ一覧に戻る  次のステップへ!

Copyright (c) Rabit 2005-2012 all rights reserved.