ここから本文です

3次元配列がわかりません 簡単なサンプルと、概念を教えてください。

mim********さん

2007/9/813:57:00

3次元配列がわかりません
簡単なサンプルと、概念を教えてください。

閲覧数:
26,581
回答数:
2
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

rc7********さん

2007/9/1119:43:01

3次元配列をイメージするにはルービックキューブをイメージすると解り易いかとおもいますよ。
ルービックキューブは小さなキューブが27個集まってできた配列と考えてみてください。
分解して一直線状に並べれば一次元配列になり、キューブを特定するには何番目のキューブと
指定することになります。
int cubic[27];
縦3行、横9列に並べれば二次元配列になり、キューブを特定するには縦何番目、横何番目の
キューブと指定することになります。
int cubic[3][9];
縦3行、横3列、高さ3段に並べれば三次元配列になり、を特定するには縦何番目、横何番目、
高さ何段目のキューブと指定することになります。
int cubic[3][3][3];

その配列には縦の位置、横の位置、そして高さの位置という3つの要素で場所を特定できます。
正面から見た場合にそれぞれの小さなキューブを識別するとしたら、縦、横、高さにそれぞれ、
上から、右から、手前から順に、0、1、2として表すなら、中心のキューブは1-1-1で
表すことができます。

そして配列の指す値を、例えば見える面の数を入れる値とするなら、

縦1番目、横1番目、高さ1番目を配列で表すとarg[0][0][0]、3面が見える角の部分なので3。
縦2番目、横1番目、高さ1番目を配列で表すとarg[1][0][0]、2面が見える辺の部分なので2。
縦2番目、横2番目、高さ1番目を配列で表すとarg[1][1][0]、1面が見える面の中央なので1。
縦2番目、横2番目、高さ2番目を配列で表すとarg[1][1][1]、中心は面が見えないので0。

※実際のメモリ上は1列に並んでいます、int arg[3][3][3]の三次元配列の場合は
arg[x][y][z]に入る値と配列の指す値を一覧にすると
x___0_0_0__0_0_0__0_0_0__1_1_1__1_1_1__1_1_1__2_2_2__2_2_2__2_2_2
y___0_0_0__1_1_1__2_2_2__0_0_0__1_1_1__2_2_2__0_0_0__1_1_1__2_2_2
z___0_1_2__0_1_2__0_1_2__0_1_2__0_1_2__0_1_2__0_1_2__0_1_2__0_1_2
値{{{3,2,3},{2,1,2},{3,2,3}},{{2,1,2},{1,0,1},{2,1,2}},{{3,2,3},{2,1,2},{3,2,3}}};

3次元は立体なのでルービックキューブを例にしてみました。
実際には3次元より3つの要素と捉えれば解りやすいかもしれません。

ある学校のテストの成績をX次元配列にまとめる場合を考えてみます。
例えば、学年、クラス別の平均点を配列に入れてまとめると、
int average[学年][クラス]; と二次元配列なります、
学年を1年生を0、2年生を1、3年生を2、クラスを1組からそれぞれ0,1,2・・と振ります。
例えば 3年2組の平均点は400点だったので配列に入れる場合は
average[2][1] = 400; 実用的にはより解りやすくする為、define 定義で
#define YEAR1 0
#define YEAR2 1
#define YEAR3 2
#define CLASS1 0
#define CLASS2 1
#define CLASS3 2
と定義した上で、代入には average[YEAR3][CLASS2] = 400;
値を取り出すときにはには output = average[YEAR3][CLASS2]; のように使われます。
※output はint output;

次に科目別平均点に分けてまとめるとすると、
int average[学年][クラス][科目];と三次元配列なります、
#define ENG 0
#define JPN 1
#define MAT 2
#define SCI 3
#define SOC 4
と定義した上で、3年2組の数学の平均点が80点なら
average[YEAR3][CLASS2][MAT] = 80;
のように使われます。

さらに平均点でなく、個人の成績をとなると、
int point[学年][クラス][科目][出席番号] と四次元配列なります、
以下、要素を増やせば次元も上がっていきますが省略します。

実際3次元以上の配列を使う場合、空きの要素が出ることもあります。
例えば上記を例に取ると1年、3年は三クラスあるが、2年は二クラスのとき
配列上は2年3組にあたるエリアが確保されますが、運用上で使わないように
します。

質問した人からのコメント

2007/9/14 22:12:41

抱きしめる ありがとうございます!

ベストアンサー以外の回答

1〜1件/1件中

fuk********さん

2007/9/814:21:55

ここに良いイメージがありました。
http://ysserve.int-univ.com/sugsi/Lecture/c2/e_04-04-03.html

C言語では変数を宣言するときに 変数名[x][y][z]で宣言可能です。
例)
iを3次元配列として宣言する場合
 int i[2][2][2];

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる