「2次元配列の初期化について知りたい」
「3次元配列について知りたい」
そんな方に向けて、多次元配列について解説します。
1次元配列より少し難しくなりますので、ゆっくりみていきましょう!
2次元配列
まずは実行してみよう
まず、以下のプログラムを実行します。
#include <stdio.h>
int main(void) {
int a[2][3]={{3,6,2},{1,5,9}};/*行列Aの値*/
printf("行列 A =\n");/*行列Aを表示*/
for(i=0;i<2;i++){
for(t=0;t<3;t++){
printf("%d ",a[i][t]);
}
printf("\n");
}
return 0;
}
このプログラムは、行列Aを画面に表示させるものになっています。
配列が二次元になったことで、行列のような縦と横に広がる数字の集まりを取り扱うことができます。
簡単な例を出すと、これまでの国語の成績を1次元配列として保存していたけど、他の科目も一緒にまとめて取り扱いたいときに、2次元配列にします。
2次元配列の書き方
要素の型 変数名 [要素数A][要素数B];
となります。
これは、1次元配列の書き方とほぼ同じで、要素数のみ増やした形となります。
2次元配列の初期化(代入のやり方)
配列の初期化をする際には基本的に2つの方法があります。(1次元配列の時と同じ)
1つ目は、{}を使う方法です。
先ほどのプログラムではこの方法で行っていました。
要素の型 変数名 [要素数A][要素数B]={{添字0の値,添字1の値,…,添字Bの値},{添字0の値,添字1の値,…,添字Bの値}};
要素数Aの数だけ{}を生成して、
{}の中には要素数Bの数だけ添字の値を入れます。
2つ目の方法は、while,for文の繰り返し処理を使う方法です。
要素の型 変数名 [要素数A][要素数B];
n=要素数A;
h=要素数B;
for(i=0:i<n:i++){
for(k=0:k<h:k++){
変数名 [i][k]=kに入れる値;
}
}
多次元配列
配列が3次元になったことで、行列の縦と横とさらに高さまで広がる数字の集まりを
取り扱うことができます。上の図では、二人目の生徒の成績も取り扱えるようになりました。
絵で表せるのが3次元までなので、4次元以降は頭の中でイメージしていくしかありません。
int seiseki[2][3][3]={
{
{80,72,90},
{86,88,92},
{42,70,94}
},
{
{71,74,76},
{50,62,65},
{89,65,90}
}
};
上の図の三次元を表す時にはこのように書きます。
基本的には2次元配列で十分書ける場合が多く、3,4次元などを扱う場合はごく稀です。
多次元配列は、2次元以上の配列のことを表し、
次元数はいくらでも大きくすることができます。
問題(発展)
今回学んだことを活かして以下の問題を解いてみましょう。
「4行4列の行列を時計回りに90度回転した行列を画面に印字するプログラム」
わかりやすいように、中の要素は1行目から順に1,2,…と入れます。
#include <stdio.h>
int main(void) {
int array_a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};/*4行4列の行列を用意*/
int array_b[4][4]={0};
int i,t;
for(i=0;i<4;i++){ /*二重ループで値をbに移す*/
for(t=0;t<4;t++){
array_b[t][i]=array_a[3-i][t];
}
}
printf("回転前\n"); /*回転前の行列を表示*/
for(i=0;i<4;i++){
for(t=0;t<4;t++){
printf("%2d",array_a[i][t]);
}
printf("\n");
}
printf("\n");
printf("回転後\n"); /*回転後の行列を表示*/
for(i=0;i<4;i++){
for(t=0;t<4;t++){
printf("%2d",array_b[i][t]);
}
printf("\n");
}
return 0;
}
発展問題のような難しいものとなっていますので、作れたら凄いくらいに思ってください。
もちろん書き方は人によって変わるので、似たような結果になれば大丈夫です!
まとめ
多次元配列の主に2次元配列について学びました!
1次元に比べて構造が複雑になっていくので、中に入れる値を間違えないようにしましょう。
こちらは配列を使った並びかえの例題解説となっていますので、実際にコードを書いて学びたい方におすすめです!