おまけのコーナー 9次元配列宣言、初期化をおこなってみよう 前半

マックス「よっしゃあああああ~


このまま9次元配列に数値を格納するぜええ


9次元配列宣言、初期化だ、初期化!🌞


まずは


9次元配列宣言

int hairetu [ ][ ][ ][ ][ ][ ][ ][ ][ ];


の[]の中の要素数を



int hairetu [2][1][2][1][2][1][2][1][2];に



設定する。


(記述が膨大になるのでマックスは[ ]の中の要素数を減らしてきました。)


これで配列変数は


2×1×2×1×2×1×2×1×2=32個生成される


実際に書き出すと


hairetu [0][0][0][0][0][0][0][0][0]

hairetu [0][0][0][0][0][0][0][0][1]

hairetu [0][0][0][0][0][0][1][0][0]

hairetu [0][0][0][0][0][0][1][0][1]

hairetu [0][0][0][0][1][0][0][0][0]

hairetu [0][0][0][0][1][0][0][0][1]

hairetu [0][0][0][0][1][0][1][0][0]

hairetu [0][0][0][0][1][0][1][0][1]

hairetu [0][0][1][0][0][0][0][0][0]

hairetu [0][0][1][0][0][0][0][0][1]

hairetu [0][0][1][0][0][0][1][0][0]

hairetu [0][0][1][0][0][0][1][0][1]

hairetu [0][0][1][0][1][0][0][0][0]

hairetu [0][0][1][0][1][0][0][0][1]

hairetu [0][0][1][0][1][0][1][0][0]

hairetu [0][0][1][0][1][0][1][0][1]

hairetu [1][0][0][0][0][0][0][0][0]

hairetu [1][0][0][0][0][0][0][0][1]

hairetu [1][0][0][0][0][0][1][0][0]

hairetu [1][0][0][0][0][0][1][0][1]

hairetu [1][0][0][0][1][0][0][0][0]

hairetu [1][0][0][0][1][0][0][0][1]

hairetu [1][0][0][0][1][0][1][0][0]

hairetu [1][0][0][0][1][0][1][0][1]

hairetu [1][0][1][0][0][0][0][0][0]

hairetu [1][0][1][0][0][0][0][0][1]

hairetu [1][0][1][0][0][0][1][0][0]

hairetu [1][0][1][0][0][0][1][0][1]

hairetu [1][0][1][0][1][0][0][0][0]

hairetu [1][0][1][0][1][0][0][0][1]

hairetu [1][0][1][0][1][0][1][0][0]

hairetu [1][0][1][0][1][0][1][0][1]


こうかな?




配列に数値を格納して初期化するための


入れ物をつくっていく手順は今まで通り


int hairetu[2][1][2][1][2][1][2][1][2]

の左端の[2]により

{ } { }を2つ作り


次に

隣の[1]により

{ }のなかに{ }を1つ作る

{{ }},{{ }}


さらに

隣の[2]により今の{ }のなかに{}を2つ作成する。

{{{ },{ }}},{{{ }, { }}}


さらに隣の[1]により{}のなかに

{}を1つ作る。

{{{{} },{{} }}},{{{{} }, {{} }}}


さらに

隣の[2]により今の{ }のなかに{}を2つ作成する。

{{{{{ },{ }} },{{{ },{ }} }}},{{{{{ },{ }} }, {{{ },{ }} }}}


さらに隣の[1]により{}のなかに

{}を1つ作る。

{{{{{{} },{{} }} },{{{{} },{{} }} }}},{{{{{{} },{{} }} }, {{{{} },{{} }} }}}


さらに

隣の[2]により今の{ }のなかに{}を2つ作成する。

{{{{{{{ },{ }} },{{{ },{ }} }} },{{{{{ },{ }} },{{{ },{ }} }} }}},{{{{{{{ },{ }} },{{{ },{ }} }} }, {{{{{ },{ }} },{{{ },{ }} }} }}}


さらに隣の[1]により今の{}のなかに

{}を1つ作る。

{{{{{{{{ } },{{ } }} },{{{{ } },{{ } }} }} },{{{{{{ } },{{ } }} },{{{{ } },{{ } }} }} }}},{{{{{{{{ } },{{ } }} },{{{{ } },{{ } }} }} }, {{{{{{ } },{{ } }} },{{{{ } },{{ } }} }} }}}



最後に今の{}のなかに

隣の[2]により数値を格納する場所を示す〇を2つ記入すると

{{{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} },{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }}},{{{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }, {{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }}}


となり、これ全体を{}でくくると


9次元配列宣言を初期化するための数値のいれもの

{{{{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} },{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }}},{{{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }, {{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }}}}


が完成する。


よおし


9次元配列宣言int hairetu[2][1][2][1][2][1][2][1][2];

に数値を格納する様式は


int hairetu[2][1][2][1][2][1][2][1][2]=

{{{{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} },{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }}},{{{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }, {{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }}}};


となるわけだ。


この様式で正しいかどうかは

まず

この〇に適当に数値を代入し


この9次元配列の配列変数の1つ

hairetu[1][0][0][0][1][0][1][0][0]に


代入された数値をprintf出力表示するプログラムをつくる。


#include <stdio.h>


int main(void)

{

int hairetu[2][1][2][1][2][1][2][1][2]=

{{{{{{{{{1,2 } },{{3,4 } }} },{{{{5,6 } },{{7,8 } }} }} },{{{{{{9,10 } },{{11,12 } }} },{{{{13,14 } },{{15,16 } }} }} }}},{{{{{{{{17,18 } },{{19,20 } }} },{{{{21,22 } },{{23,24 } }} }} }, {{{{{{25,26 } },{{27,28 } }} },{{{{29,30 } },{{31,32 } }} }} }}}};

printf("%d\n",hairetu [1][0][0][0][1][0][1][0][0]);

return 0;

}


そして,このプログラムがコンパイルできて23がでてきたならOK!


(なぜhairetu [1][0][0][0][1][0][1][0][0]に23が格納されているのかわかるのか


その理由は 後述しちゃうぞ~~(´▽`*))


9次元配列作製成功となるわけだ。」


てんC 「マックスさん ついにここまできましたか。」


マックス 「わははははっ、それではコンパイルっ」

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

てんC「コ・ン・パ・イ・ル結果は・・・










またまたお見事無事コンパイルされ


コンパイル結果

23


です。


9次元配列宣言、初期化も成功しています。 マックスさん(^^)」



。。。。。。。。。。。。


ここで9次元配列宣言

int hairetu[2][1][2][1][2][1][2][1][2];

を初期化する数値のいれもの

{{{{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} },{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }}},{{{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }, {{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }}}}


int hairetu[2][1][2][1][2][1][2][1][2];


1番左端の

[2]によってつくられた最初の{} ,{}に左から0番目.1番目


その{}の中の

[2]の右隣の[1]によってつくられた{}に0番目


さらにその{}の中の

[1]の右隣の[2]によってつくられた{},{}に0番目.1番目、

さらにその{}の中の

[2]の右隣の[1]によってつくられた{}に0番目

さらにその{}の中の

[1]の右隣の[2]によってつくられた{},{}に0番目.1番目、

さらにその{}の中の

[2]の右隣の[1]によってつくられた{}に0番目

さらにその{}の中の

[1]の右隣の[2]によってつくられた{},{}に0番目.1番目

さらにその{}の中の

[2]の右隣の[1]によってつくられた{}に0番目

さらにその{}の中の

[1]の右隣の[2]によってつくられた〇,〇に0番目.1番目


と順番が対応しています。


0番目から{}に順番が名づけられているのは


1,2,3、4、5次元配列のときとおなじです。


その {}につけられた0,1の順番をたよりに


{}を次々選んでいくと


たとえば


1,0,0,0,1,0,1,0,0と選択する場合は次のようになります


1より最初に生成される{} ,{}の右の1番目にあたる{}を選択

0よりその{}の中の0番目にあたる{}を選択

0よりその{}の中の0番目にあたる{}を選択

0よりその{}の中の0番目にあたる{}を選択

1よりその{}の中の1番目にあたる{}を選択

0よりその{}の中の0番目にあたる{}を選択

1よりその{}の中の1番目にあたる{}を選択

0よりその{}の中の0番目にあたる{}を選択

0よりその{}の中の0番目にあたる〇を選択


すると その○の場所は


hairetu [1][0][0][0][1][0][1][0][0]


に数値が格納される場所となっています。


1,0,0,0,1,0,1,0,0に対応しています。


この場合

9次元配列の中の

配列変数の1つ


hairetu [1][0][0][0][1][0][1][0][0]の場所は


図では◎の位置にあたることがわかります。


int hairetu[2][1][2][1][2][1][2][1][2]=

{{{{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} },{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }}},{{{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{◎,〇 } }} }} }, {{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }}}};


コンパイル結果では23が格納されていますね。


逆に


コンパイル結果の23から


hairetu [1][0][0][0][1][0][1][0][0]に数値を格納する場所は


{{{{{{{{{1,2 } },{{3,4 } }} },{{{{5,6 } },{{7,8 } }} }} },{{{{{{9,10 } },{{11,12 } }} },{{{{13,14 } },{{15,16 } }} }} }}},{{{{{{{{17,18 } },{{19,20 } }} },{{{{21,22 } },{{23,24 } }} }} }, {{{{{{25,26 } },{{27,28 } }} },{{{{29,30 } },{{31,32 } }} }} }}}};


23の位置と


割り出すこともできます。


この


コンパイル結果の23から


hairetu [1][0][0][0][1][0][1][0][0]に


数値を格納する場所を割り出す方が簡単です


同じことの繰り返しになりますが


ここでは実際に


マックス達が


hairetu [1][0][0][0][1][0][1][0][0]に格納される


数値の場所が◎の位置にあたるかどうかを


で確認した手順を


私、solarplexussが再度みていきましょう。


さあ、配列変数 

hairetu [1][0][0][0][1][0][1][0][0]に数値を格納する場所は


{{{{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} },{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }}},{{{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{◎,〇 } }} }} }, {{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }}}}


の中の◎の位置にあたるのでしょうか


再び


さきほどの手順に沿ってすこしづつしらべてみます。


9次元配列宣言

int hairetu[2][1][2][1][2][1][2][1][2];


の一番左の[2]によってつくられた{} ,{}を


左から0番目.1番目と数えた時の


1番目の{}のなかにhairetu [1][0][0][0][1][0][1][0][0]に数値を格納する場所は含まれています。


そして さらに詳しく見ていくと


その{}の中の

[2]の右隣の[1]によってつくられた1つの{}


つまり0番目の{}の中にhairetu [1][0][0][0][1][0][1][0][0]に数値を格納する場所は含まれています。



そして さらに詳しく見ていくと


その{}の中の

[2]の右隣の[1]の右隣の[2]によってつくられた{},{}を


左から0番目.1番目と数えた時の


0番目の{}のなかにhairetu [1][0][0][0][1][0][1][0][0]に数値を格納する場所は含まれています。



さらに詳しく見ていくと


その0番目の{}の中の


[2]の右隣の[1]の右隣の[2]の右隣の[1]によってつくられた1つの{}


つまり0番目の{}にhairetu [1][0][0][0][1][0][1][0][0]に数値を格納する場所は含まれています。


さらに詳しく見ていくと


その0番目の{}の中の

[2]の右隣の[1]の右隣の[2]の右隣の[1]の右隣の[2]によってつくられた{},{}を


左から0番目.1番目と名づけた時の


1番目の{}の中にhairetu [1][0][0][0][1][0][1][0][0]に数値を格納する場所は含まれています。


さらに詳しく見ていくと


その1番目の{}の中の

[2]の右隣の[1]の右隣の[2]の右隣の[1]の右隣の[2]の右隣の[1]によってつくられた1つの{}


つまり0番目の{}の中に


hairetu [1][0][0][0][1][0][1][0][0]に数値を格納する場所は含まれています。



さらに詳しく見ていくと

その0番目の{}の中の


[2]の右隣の[1]の右隣の[2]の右隣の[1]の右隣の[2]の右隣の[1]の右隣の[2]によってつくられた{},{}に


左から0番目.1番目と順番をつけたときの


1番目の{}の中にhairetu [1][0][0][0][1][0][1][0][0]に数値を格納する場所は含まれています。



さらに詳しく見ていくと

その1番目の{}の中の

[2]の右隣の[1]の右隣の[2]の右隣の[1]の右隣の[2]の右隣の[1]の右隣の[2]の右隣の[1]によって


つくられた1つの{}


つまり0番目の{}の中にhairetu [1][0][0][0][1][0][1][0][0]に数値を格納する場所は含まれています。



そうして

その0番目の{}の中の

[2]の右隣の[1]の右隣の[2]の右隣の[1]の右隣の[2]の右隣の[1]の右隣の[2]の右隣の[1]の右隣の[2]によって


つくられた〇,〇に左から0番目.1番目と順番をつけたときの


0番目の〇の位置が(◎にあたります)

hairetu [1][0][0][0][1][0][1][0][0]に数値を格納する場所にあたります。


ふぃ~~~


このように


9次元配列宣言

int hairetu[2][1][2][1][2][1][2][1][2];

を初期化するための数値のいれもの


{{{{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} },{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }}},{{{{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{◎,〇 } }} }} }, {{{{{{〇,〇 } },{{〇,〇 } }} },{{{{〇,〇 } },{{〇,〇 } }} }} }}}}

のどの位置が


hairetu [1][0][0][0][1][0][1][0][0]に


数値を格納する場所なのか?を手作業で探してみました。。


感想は


{}は

0番目から順番がつけられているし


{}が並んでいると


その{}は


0番目の{}だったか1番目の{}だったか?


確認が紛らわしく


hairetu [1][0][0][0][1][0][1][0][0]に


数値を格納する場所◎を手作業で探すのは大変です。


ですので


やはり


{{{{{{{{{1,2 } },{{3,4 } }} },{{{{5,6 } },{{7,8 } }} }} },{{{{{{9,10 } },{{11,12 } }} },{{{{13,14 } },{{15,16 } }} }} }}},{{{{{{{{17,18 } },{{19,20 } }} },{{{{21,22 } },{{23,24 } }} }} }, {{{{{{25,26 } },{{27,28 } }} },{{{{29,30 } },{{31,32 } }} }} }}}}

の中から


hairetu [1][0][0][0][1][0][1][0][0]に


数値が格納される場所を知りたい場合


命令文

printf("%d\n",hairetu [1][0][0][0][1][0][1][0][0]);


をコンパイルして


表示される数値23の場所が

hairetu [1][0][0][0][1][0][1][0][0]のに


数値を格納する場所になるので


手作業で場所を確かめるより


プログラムをコンパイルしたほうが早くて正確に


hairetu [1][0][0][0][1][0][1][0][0]に数値を格納できる場所を


確認できます・・・が


なんか別に


hairetu [1][0][0][0][1][0][1][0][0]の場所を知っても


あまり意味ないかも・・・・・(マックス談)











  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます