配列   





 
 
配列の定義と引用
 
 

 Mindでは配列を次のように定義する。

構文=
売り上げは 31個の 変数 ↑配列名  ↑要素数  ↑変数の型         ─── 宣言できる変数の型 ───     数値変数: 変数、 小数変数、 ・・など数値系の変数     文字列変数:文字列、 文字列実体、 単純文字列実体、 ・・など文字列系の変数
 配列は変数群に代表して1つの名前を付け、個々の要素をは添え字付きの表記でアクセスできるようにしたものである。
 上の例では1ヶ月=31日分(31個)の変数が一度に確保され、結果的に1日の売り上額を1要素ごとに格納して使う形となる。
 「31個の」の箇所にある「個」という助数詞はこれ自体には意味がないので惑わされないで欲しい(助数詞は無視される)。ここは「31ヶの 変数」でも、単に「31の 変数」でもよいのだが、筆者は配列定義では好んで「個」を使っている。。
 個々の要素は次のように識別される。
    売り上げ(15)を ・・・
 上記で15日目の売り上げを指し示したことになる。かっこによる要素の指定部分を「添え字」と呼ぶことにする。添え字は配列名に密着して記述しなければならない。
 添え字は1から数える(他のプログラム言語では配列添え字は0から数えるものが多いので注意)。これは日常社会で番号を1から数えることが多いことに対応したものである。例えば、1月、1階、1棟、1年1組のようなものである。
 先の「売り上げ」の配列を例にとると、添え字の有効範囲は1から31となる。この範囲外を与えると、次のようなエラーメッセージが表示され、プログラムの実行を強制的に終了するようになっている。
    エラー:配列要素番号が異常です。
 さて、先の添え字の記述例では数値で直接指示していたが、ほかに、処理単語名や変数名を記述することができる(実際のプログラムはそのほうが多いだろう)。下にまとめておく。
 添え字として記述できるもの:
  • 整数の定数
  • 整数の変数
  • 処理単語(整数を返すもの)
  • 整数を返す関数
 回数指定の繰り返し文の中で、現在の回数を「回数」によって引用し、これを添え字とすることもできるので覚えておきたい。ちなみに「回数」は整数を返す処理単語である。
 配列の要素への参照・代入は、個別の変数の場合のときとまったく同じである。例えば、参照は、
今日は 変数。 ○○とは     15を 今日に 入れ     売り上げ(今日)が 10000円より 大きい
のようになる。また、代入ほかの操作も、
    10000円を 売り上げ(今日)に 入れる     売り上げ(今日)を クリアする     100円だけ 売り上げ(今日)を 増加する
というように、数値変数に対するすべての操作がこの配列要素に対して可能となる。
 配列を参照するプログラムの例として、1 ヶ月分のすべての日の売り上げを一覧表示するものを示す。
売り上げ一覧表示とは (・ → ・)     売り上げの 要素数を     回数指定し         回数を 二桁で数値表示し         「日 」を 表示し         売り上げ(回数)を 数値表示し 「円」を 表示し 改行し     繰り返すこと。
 上のプログラムを走らせると以下のような表示がされる。
1日 27810円
2日 53960円
3日 36290円
4日 47691円
5日 22760円
・・・・・・・・
 次の部分に注目して欲しい。
    売り上げの 要素数を     回数指定し         ・・・・・
 「要素数」はMindの予約語であり、読んで字のごとく配列の要素数を引用する特殊な働きを持つ。この例では売り上げの要素数は31個として宣言しているので、コンパイラはここに31と書いたのとまったく同じコードを生成し、結局は、
    31を     回数指定し         ・・・・・
と記述するのと等価となる。将来、売り上げの個数が変更になった場合のことを考えると「要素数」を使ったほうが優れている。そうしておけば将来、配列の長さである31を変更するような場合、プログラムのあちこちにある31をすべて訂正する必要がなく、配列定義の1箇所で済む。
 添え字の箇所で、複数の単語を並べて計算することができないことに注意しなければならない。例えば、
    売り上げ(当日から 3を 引いたもの)が ・・・
のような記述はエラーとなる。
 これを回避する1つの方法として、次のように、演算結果をいったん変数に代入する方法がある。
○○とは         参照番号は 変数     当日から 3を 引き 参照番号に 入れ     売り上げ(参照番号)が ・・・
 あるいは、この演算部分を、1つの処理単語(局所処理単語が向いている)として定義する手もある。
○○とは   参照番号とは (・ → 番号)    ←局所処理単語     当日から 3を 引いたもの   本体とは     売り上げ(参照番号)が ・・・


 
 
配列全体の参照
 
 

 さて、先の配列「売り上げ」にはもう1つの顔がある。それは配列全体の代表としての名称である。
 たとえば以下のように書いた場合、
    売り上げを クリアする
 添え字をわざと省略したこの表記は配列全体を引用することになる。上のプログラムは、配列の全要素に0を代入する簡単かつ高速な処理なので覚えておきたい。
 文字列系の変数を配列宣言している場合の「クリア」は全要素に空列(空文字)を設定したことになる。(逆に、うっかりして添え字を忘れるとこのような扱いになるので注意が必要である)
 配列全体の操作としては次のような機能も利用できる。
売り上げは   31個の 変数。 売り上げ控えは 31個の 変数。 ○○とは     ・・・・・・・     売り上げを 売り上げ控えに 入れる     ・・・・・・・
 上記は、「売り上げ」と同じ要素数のもう1つの配列「売り上げ控え」に対して、配列を丸ごとの複写を行うものである。これも先の「クリア」と同様、全要素に対して一括して高速な複写を行うことができる。
 このような配列全体の引用は、集合としての性格を持つ関係上、個々の要素の引用とは別格なので当然ながら注意したい。例えば、
    売り上げが 10000円より 大きい
のような参照は、この「売り上げ」が配列名である場合には無意味な処理であり、実際、このようなプログラムはコンパイル時にエラー検出される。


 
 
文字列変数の配列
 
 

 前項では数値変数の場合についてのみ述べたが、文字列変数も同様に配列として宣言できる。文字列変数の例を1つ示しておく。

構文=
住所は 100人分の 文字列実体 長さ 200桁 ↑配列名  ↑要素数      ↑変数の型           ─── 宣言できる文字列型変数 ───       文字列、 文字列実体、 単純文字列実体、 ・・など文字列系の変数
 上は文字列実体の変数を配列として確保した例である。
 このうち、”文字列実体”、”単純文字列実体” など実体系の配列では、要素数が非常に多かったり、あるいは1要素の長さが非常に大きい場合に総量としてメモリ消費量が大きくなるので注意を払う必要がある。
 なお、変数宣言の箇所に「○○は 文字列」による文字列情報の変数ももちろん宣言できる。ただし、配列を大域変数として使う場合には、第4章「実体変数と情報変数の使い分け」で述べたように、対応する文字列実体の保証が不安な場合には文字列情報型でなく、文字列実体型を使うように気を付けたい。


 
 
2次元以上の配列は構造体・型紙へ‥
 
 

 Mindで「配列」といった場合、1次元のことを指す。2次元以上の配列については、さらに上位の概念である「構造体」あるいは「型紙」を利用する。構造体・型紙については第10章で解説する。



 
 
定数配列
 
 


 
数値の定数配列
 

 初期値を持った配列を定義できる。データ型によって「定数配列」、「文字列定数配列」などがある。

構文=
<配列名> 定数配列      ←整数値の配列     <数値> <数値> ・・・・・     <数値> <数値> ・・・・・     ・・・・・・・・・・・・・・・。 <配列名> 小数定数配列    ←小数値の配列     <小数値> <小数値> ・・・・・     <小数値> <小数値> ・・・・・     ・・・・・・・・・・・・・・・。
 上記では数値を縦横に並べているが、あくまでソースコード上の配置であり、どう書いても結果的には1次元配列として生成される。
 各数値は整数(定数配列)あるいは小数(小数定数配列)として評価される。なお、コード生成を節約するために、「バイト定数配列」「ワード定数配列」というバリエーションもある(16ビット整数、8ビット整数版である)。
 例として、日本の通貨 9 種類を定数配列として定義してみよう。
金種配列は 定数配列     10000 5000 1000 500     100 50 10 5 1。
 この配列のアクセスは、普通の1次元配列と同じでよい。つまり、
    金種配列(3)を 数値表示 ・・・
のように参照する。
 この配列の値は書き換えができないので注意すること。例えば、
    300を 金種配列(4)に 入れる
というような記述はエラーになる。
 定数配列の要素数は「要素数」という予約語を使うことで参照できる。たとえば前記の金種配列の全要素にたいして何か処理を施すような場合に、
    金種配列の 要素数を     回数指定し         ・・・・・・・         ・・・・・・・     繰り返し
というプログラムにしておけば、将来の金種の増加に自動対応できる。
 さて、定数配列の値は変えられないといったが、代替策として、同じ要素数の普通の配列を別に定義しておき、そこへ「入れる」によって全要素を丸ごと代入し、そちらをアクセスするように変えるという手がある。(両者の要素数が同一であれば、単に「入れる」で丸ごと代入ができる)


 
文字列の定数配列
 

 先の「定数配列」は数値定数専用であったが、文字列定数を配列にしたい場合にはこちらを用いる。

構文=
<配列名> 文字列定数配列     <文字列定数> <文字列定数> ・・・・・     <文字列定数> <文字列定数> ・・・・・     ・・・・・・・・・・・・・・・。
 定数のソースコード上の縦横並びは自由だが、結果的には1次元配列として生成される。
 下記のような例が考えられる。
警報文は 文字列定数配列     「地震」 「火災」 「水害」 「盗難」。
 引用例は、
    警報文(警報番号)を 表示 ・・・
のようになる。
 文字列定数配列に対しても、「要素数」を使うことができる。