1.配列で変数を一まとめさて、配列というのは何でしょうか。配列という言葉を見ていてもなかなか意味が分かりませんね。簡単に言ってしまうと、配列というのは「いくつかの変数をひとまとめにしたもの」という意味です。実際に例を挙げて説明してみたいと思います。例えば、学校で身体測定をするときに、身長の長さを学校中の生徒が測りますよね。学校中の生徒だと何百人といて、入力するのが大変なので、簡単に10人としましょう(一クラスにも満たないですが...)。10人分の身長を入れる変数として、「shincho」という変数を用意しましょう。しかし、この変数にどんどん10人分の身長を入れてしまっては、前の人の身長が後に入力した人の身長に消されてしまいますから、少しだけ変数の名前を変えて、似ているけれども罰の変数を用意しなければなりませんよね。そこで「shincho1,shincho2,・・・shincho10」という変数を用意し、その中に順番に10人分の身長を入力していきます。後は、この変数を使って、身長の平均を出したり、身長が正常な伸びをしているかどうかなどを調べていくことでしょう。 今まではこのように、少し名前を変えて個数分の変数を用意し、その中にデータを入力するのが限界でした。しかし、これはかなり大変な作業となる場合があります。少し考えてみれば分かりますg、もし対象となるもの(この場合生徒の数)が100や200も合ったらどうしましょう。100個も200個も変数を用意し、全て入力時や計算字に列挙しますか。考えてみただけでも嫌気がさしてしまいます。どうせ「身長」という同じ名前をしているのだから、その名前で統一できる方法があったら簡単に100,200人分のデータを扱うことができますよね。その方法が、配列というわけです。 ちなみに、いくつかのものをまとめたものが配列と呼ばれるのに対し、変数のような、それ一つが全体となっているもののことを「スカラ」といいます。コンパイラなどのソフトの説明書を見ていると、沢山この「スカラ」という言葉が出てきますが、それは、要は「変数」で、「配列」ではない、ということです(配列の要素はスカラです)。 配列の作り方は、「DIMENSION」文を使います。DIMENSIONというのは、「次元」「規模」という意味ですね。例えば、上の10人の生徒の身長を格納する配列を作る場合、下のように書きます。 real shincho dimension shincho(10) DIMENSION文は配列の規模を指定するだけなので、この文とは別に型宣言文が必要となりますので、忘れないようにしてください。DIMENSION文の配列名の隣の括弧には、作りたい配列の規模を書きます。この場合はshinchoという変数を10個まとめた配列を作りたいので、「shincho(10)」となります。この出来上がった配列は、今まで「shincho1,shincho2,・・・shincho10」と表してきたものが、「shincho」という配列名一つを書くことで表すことができます。まとめられる変数の数が100個、200個の場合であっても、配列名一つで変数群を表すことができるので、非常にコンパクトに表すことができ、便利です。 これまではまとめあけられた変数一つ一つを「shincho1,shincho2,・・・shincho10」と表してきましたが、配列を作った場合は、そのまとめられた変数一つ一つの表し方が変わります。この場合、「shincho(1),shincho(2),・・・shincho(10)」というように、「配列名(何番目)」という形で表すことになります。2番目なら「shincho(2)」、5番目なら「shincho(5)」と書くのです。また、これら配列にまとめられたものは、変数ではなく「要素」と呼ぶことになっています。つまり、「shincho(1),shincho(2),・・・shincho(10)」はshinchoという配列の10個の要素、ということになります。確認しておきましょう。配列というのは、まとめあがった全体名のことで、要素というのは、その全体の配列の一部分のことです。 配列は、いろいろな形を作ることができます。今、皆さんに紹介したのは1次元の配列と呼ばれるものです。次元というのは、簡単に言ってしまえば数学で用いたグラフの字句で示される空間のことです。数学の時間に、「数直線」というのを扱ったことがあるかと思います。確か中学校のころでしたね。数直線というのは、横に右矢印の線が引っ張ってあって、右側に「x」が付いていて、その線上にxが5であれば原点から5個離れた5の位置に、-2であれば-2の位置に点が打たれている、あれです。あれが、1次元の世界なのです。1次元と呼ばれるゆえんは、横(見方を変えれば縦)でしか物事を表すことができないからです。下のが、1次元の世界ですね。 ![]() 2次元というのはどういうものでしょうか。これも高校の数学の時間にはおなじみであった、x軸とy軸によるグラフです。全てのものはxとyによって表される世界ですね配列では、上の1次元とこの2次元が非常によく使われます。 ![]() 3次元の世界というのもあります。下の図の形をした世界ですね。縦と横と高さによってものが表されます。配列の次元は、最高で7まで作ることができます。3次元以降はどのように図で表すのか、僕には分からないのです(今のところ3次元が最高のようですね。4次元は時間を軸として追加するとか何とか)が、配列なら、ドラえもんのポケットの世界である4次元を超えたはるか先の世界までも作り出すことが可能だ、ということですね。すごいですね、配列って。 ![]() では、実際にいろいろな次元の配列を作って見ましょう。作り方はいたって簡単です。書く次元の規模を示す数字の間にカンマを入れてあげればいいだけのことです。例えば、縦が2つで横が3つの2次元の配列を作るには、下のように書きます。 integer a dimension a(2,3) すると、コンピュータ上には、下の図のような配列が出来上がります。ちなみにプログラミングでは、下のような2次元の配列のことを、「行列」と呼んでいます。この名前も数学から取り寄せています。縦が行で、横が列、ということですね。コンピュータを利用する目的の一つは、複雑な計算の答えを簡単に求めるためなので、プログラミングを学んでいく時はこうした数学の概念が沢山出てきます。とりあえず2次元の配列は行列とも呼ぶんだ、ということだけ知っておいてください。僕も難しいことは分かりません。 ![]() この図を見れば分かるように、出来上がった行列の要素(一つ一つの箱)は、1次元目の番号と、2次元目の番号によって決まります。例えば、下の段の真ん中にある要素は、2行目の2列目なので、(2,2)で表すことができます。3次元の場合も同様に、書く次元の規模をカンマで区切って、 integer b dimension b(3,4,2) と書くことで、3×4×2の3次元の配列が出来上がります。これを図にするのは難しいですが、考え方は同じです。これ以降の次元についても、全く同じようにして作ることができます。4次元でも5次元でも可能です。 これまで作ってきた配列は全て「1」から始まるものばかりでした。1次元でも1から始まり、上の二次元でも、1次元目と2次元目は共に始まりが1です。Fortranが他の言語にくらべて素晴らしいとされる点の一つに、この配列の始まりの番号を変えることができる、というのがあります。少し配列宣言の仕方を変えるだけで、1以外の要素番号から始まる配列が作れるのです。その場合は、コロン「:」を使います。とりあえず、下の宣言文を見てください。 integer y dimension y(-5:5) これは、要素がー5から5までの計11個(0を含むので)の1次元配列です。各次元の要素の始まりの番号と終わりの番号との間にコロンを挟むことで、両者を最大、最小とする配列が出来上がります。こうした機能は、他のプログラミング言語には見られない、よい機能です。よさの例としては、例えば「y=f(x)」の式を扱う場合です。yの値はxによって決まります。xが1のときのyの値と、xが2のときのyの値は別の値になりますね。そのyの値を求めるときには、対応するxの値が分かっていると便利です。グラフを作るときには特にそうです。そこで、上のような規模の配列を作るのです。xの値の範囲は-5以上5以下としましょう。xが-5のときのyの値は「y(-5)」、xが4のときのyの値は「y(4)」と表すことができます。そうすれば、yの値とxとの関係が簡単に把握できるようになるのです。ですから、配列の始点を決めることができるというのは、非常に便利なことなのです。 他の言語にこのようの機能はありません(僕の知る限りでは)。また他の言語とは配列の作られ方が違います。Fortranで配列を作ると、始点が1から始まりますが、例えばC言語では「0」から始まります。ほとんどの言語は、配列の始まりが0です。人間にとっては1から始まったほうがしっくりきて使いやすいと思いますが、コンピュータの都合によると、0から始まったほうがいいのでしょうか。 ちなみに、今まで配列を作るときの配列宣言は、DIMENSION文を使用して行なってきました。もちろんこの方法は正しいのですが、これ以外にも配列の作り方はあります。それは、型宣言と一緒に配列宣言をする方法です。上のyの宣言を、この方法で作り変えてみます。 integer y(-5:5) こちらの方が簡単ですね。暗黙の型宣言を使用せずに、全ての変数を宣言するのであれば、DIMENSION文を使用するよりも、こちらの宣言の仕方を使うべきですね。なぜかというと、DIMENSION文を使用する場合でも、その文とは別に型宣言をしなくてはならないので、どうせ型宣言を行なうのであれば、配列宣言も一緒にしてしまったほうが簡単だからです。見易さもこちらのほうがいいと思います。わざわざ型宣言文と配列宣言文を2箇所に分けて書くよりも、一つにまとめてしまったほうが、その変数の特性が把握しやすくなりますからね。Fortran90であれば、下のようなDIMENSION文の使い方もあります。 integer,dimension(3)::a,b,c,d 型宣言文とDIMENSIONがくっついていたり、二つコロンが続いているとかはじめてみる宣言の仕方ですが、要はこう書くと宣言文をまとめることができる、というだけのことです。深く考えないようにしてください。この宣言により、a,b,c,dの4つの変数が、1次元で要素3つの配列形式になりました。このように、いくつかの変数が型も配列の形状も同じである場合、わざわざそれぞれの変数の横に要素数を書く(「a(3),b(3)...」)宣言の仕方よりも、このように形状はDIMENSION文にくっつけて、配列名だけ右側に並べるという書き方をしたほうが、書くのが面倒でなくなり、配列の形状もわかりやすくなります。先ほども申し上げたとおり、配列宣言は型宣言文で行なうことができるので、DIMENSION文の有効な使い方というのはこれぐらいかもしれません。 結構長々と説明してきたので、そろそろ読んでいてだれてくるころだと思いますので、ここで練習問題を出したいと思います。簡単ですので、頭の中でやってもらうだけで結構です。では、始めてください。 (1)a1を実数型で、3×3×8×9の4次元、a2を整数型5×3の2次元の配列として作成せよ(DIMENSION文使用)。 (2)bを倍精度実数型の2×3、cを文字型の4、dを論理型の3×3である配列として作成せよ。 (1) real a1 integer a2 dimension a1(3,3,8,9),a2(5,3) (2) double precision b(2,3) character*10 c(4) logical d(3,3)
|