3 いろいろな配列

3.1 1次元配列

多くのデータを取り扱うときには、配列と言うデータ構造を用いる。その宣言は、データ の型名と配列名、そしてその大きさを記述する。たとえば、次のようにである。
	
	int ab[1000000], cd[1000];
	double xy[1000000], z[60];
これで、 が確保できた。

このデータ構造で、個々の内容にアクセスするためには、配列名と自然数である添え字 (インデックス)を指定する。次のようにする。

	
	a = ab[12345];
	ab[23456] = 654321;
	scanf("%d",&ab[34567]);
	printf("%d\n",ab[45678]);
 
今まで、使ってきた単純型と同じである。

大量のデータを取り扱うとき、単純型のように、その都度、アクセスする配列名と添え字 を指定するプログラムを書くのでは、配列を使う意味はほとんどない。繰り返し(ループ) 文とともに使って、配列の有用性が発揮できる。たとえば、つぎのようにすると、

	for(i=0; i<=360; i++){
	  s[i] = sin(i*3.1415/180);
	  c[i] = cos(i*3.1415*180);
	}
の三角関数の値が0〜360度まで計算できる。

一次元配列のイメージを図2に示す。

図 1: 一次元配列のイメージ
\includegraphics[keepaspectratio, scale=1.0]{figure/one_dim.eps}

3.2 2次元配列

1次元配列は、配列名とひとつの添字(自然数)でデータにアクセスする。それに対して、配列名と2つの添字を用いるものを2次元配列と言う。たとえば、1日の最高気温を年間に渡って、データとして格納したい場合、
	
	double max_temp[13][32];
と言うように配列を宣言して用いる。これで、max_temp[0][0]max_temp[12][31]まで、使える。

これに、最高気温をキーボードから入力する場合、

	int max_temp[13][32];
	int dates[13] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	int i,j;

	for(i=1; i<=12; i++){
	  for(j=1; j<=dates[i]; j++){
	   printf(%d月%d日の最高気温を入力して下さい\n", i, j);
	   scanf("%lf", &max_temp[i][j]);
	  }
	}
のように書く。配列datesには、月の日数を入れておく。閏年は考えていない。2次元配列にアクセス屡ときには、二重ループが使われることが多い。

二次元配列のイメージを図2に示す。

図 2: 二次元配列のイメージ
\includegraphics[keepaspectratio, scale=1.0]{figure/two_dim.eps}

3.3 多次元配列

配列の添字の数を次元と言う。それが1個だと1次元配列、2個だと2次元配列、それ以上のものも考えられる。 先程の最高気温を年月日で処理する場合、3次元配列が適当であろう。


ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成16年10月22日


no counter