p.142 3次元以上の配列
・C#では次元数の制限はない
・3次元配列の宣言の書式: データ型[,,] 配列名;
・3次元配列の要素の生成の書式: 配列名 = new データ型[要素数①, 要素数②, 要素数③];
・宣言と要素の生成は同時に行うことができる
書式: データ型[,,] 配列名 = new データ型[要素数①, 要素数②, 要素数③];
・3次元配列では、要素の利用には3つの添字が必要
・よって、for文による繰り返しを3重化すると良い
・例:
string[,,] names = new string[2, 3, 4]; //2種族各3グループ各4匹のモンスター名
for (int i = 0; i < 2; i++) { //2種族の分、繰返す
for (int j = 0; j < 3; j++) { //各3グループの分、繰返す
for (int k = 0; j < 4; j++) { //各4匹の分、繰返す
name[i, j, k] = Console.ReadLine();
}
}
}
・初期値を列挙することによる初期化が可能
・3次元配列初期化の書式: 型[,,] 配列名 = { { {値,…}, … }, … }
・例: int[,] n = {{{1,2,3,4},{5,6,7,8},{9,10,11,12}},{{13,14,15,16},{17,18,19,20},{21,22,23,24}}};
・要素数は省略できるが「●×■×▲」の形式になる必要がある
p.142(次元数と要素数の取得)
・配列の次元数は「配列名.Rank」で得られる ・配列の全要素数は多次元配列においても「配列名.Length」で得られる ・C/C++等にように、多次元配列で「配列名[添字].Length」で上位要素数を得ることはできない
p.143 array04.cs
//p.143 array04.cs
using System;
class array04 {
public static void Main() {
int[,,] ar = new int[2, 2, 3] { //「new int[2, 2, 3]」は省略可
{
{0, 1, 2}, //順に[0,0,0][0,0,1][0,0,2]
{3, 4, 5} //順に[0,1,0][0,1,1][0,1,2]
},
{
{6, 7, 8}, //順に[1,0,0][1,0,1][1,0,2]
{9, 10, 11}//順に[1,1,0][1,1,1][1,1,2]
}
};
Console.WriteLine("配列の次元 = {0}", ar.Rank); //次元数を表示
Console.WriteLine("arの個数 = {0}", ar.Length); //要素数を表示
for (int i = 0; i < 2; i++) { //1番目の添字
for (int j = 0; j < 2; j++) { //2番目の添字
for (int k = 0; k < 3; k++) { //3番目の添字
Console.Write("{0}, ", ar[i, j, k]); //順に表示
}
}
}
Console.WriteLine(); //改行
}
}
アレンジ演習:p.143 array04.cs
・4次元配列[2,2,2,3]にしよう
作成例
//アレンジ演習:p.143 array04.cs
using System;
class array04 {
public static void Main() {
int[,,,] ar = { //「new int[2, 2, 2, 3]」を省略
{
{ {0, 1, 2},{3, 4, 5} },
{ {6, 7, 8},{9, 10, 11} },
},
{
{ {0, 1, 2},{3, 4, 5} },
{ {6, 7, 8},{9, 10, 11} },
}
};
Console.WriteLine("配列の次元 = {0}", ar.Rank); //次元数を表示
Console.WriteLine("arの個数 = {0}", ar.Length); //要素数を表示
for (int i = 0; i < 2; i++) { //1番目の添字
for (int j = 0; j < 2; j++) { //2番目の添字
for (int k = 0; k < 2; k++) { //3番目の添字
for (int l = 0; l < 3; l++) { //4番目の添字
Console.Write("{0}, ", ar[i, j, k, l]); //順に表示
}
}
}
}
Console.WriteLine(); //改行
}
}
p.144 ジャグ配列
・C#における多次元配列のもう一つの様式で、配列の配列によって多次元配列を表す
・通常の多次元配列より記述が煩雑になるが、内側の要素数の異なる多次元配列を構築できるので、メモリの無駄を省くことができる
・以下は2次元のジャグ配列の場合:
・「[,]」ではなく、C/C++/Java等と同様に「[][]」で表す
・ジャグ配列の例:a[0][0] a[0][1] a[1][0] a[2][0] a[2][1] a[2][2]
・ジャグ配列の宣言の書式: データ型[][] 配列名;
・ジャグ配列の要素の生成の書式:
配列名 = new データ型[要素数①][];
配列名[0] = new データ型[要素数②]; 配列名[1] = new データ型[要素数③]; …
・初期値を列挙することによる初期化が可能
・ジャグ配列初期化の書式:
配列名 = new データ型[要素数①][];
配列名[0] = new データ型[要素数②]{値,…}; 配列名[1] = new データ型[要素数③]{値,…}; …
・「●×■」の形式になる必要はない
・配列の全要素数はジャグ配列においては「配列名.Length」では得られず、構成する配列数になる
・「配列名[添字].Length」で各配列の要素数が得られる
p.144 jagged01.cs
//p.144 jagged01.cs
using System;
class jagged01 {
public static void Main() {
int[][] ar; //(2次元)ジャグ配列の宣言
ar = new int[2][]; //上位次元の要素数=含む配列の数は2
ar[0] = new int[3]; //下位次元の要素数=含まれる配列①の要素数は3
ar[1] = new int[3]; //下位次元の要素数=含まれる配列②の要素数は3
//下記の※は含まれる2配列の要素数がどちらも3だから可能だが、そうとは限らない
for (int i = 0; i < 2; i++) { //上位次元の要素数=含む配列の数だけ繰返す
for (int j = 0; j < 3; j++) { //下位次元の要素数=含まれる配列の要素数だけ繰返す(※)
ar[i][j] = (i + 1) * (j + 1); //要素に値を代入
}
}
for (int i = 0; i < 2; i++) { //上位次元の要素数=含む配列の数だけ繰返す
for (int j = 0; j < 3; j++) { //下位次元の要素数=含まれる配列の要素数だけ繰返す(※)
Console.WriteLine("ar[{0}][{1}] = {2}", i, j, ar[i][j]);
}
}
}
}
p.146 jagged02.cs
//p.146 jagged02.cs
using System;
class jagged02 {
public static void Main() {
string[][] name = new string[2][]; //(2次元)ジャグ配列の宣言と上位次元の要素数=含む配列の数は2の指定
name[0] = new string[2]{"田中", "工藤"}; //含まれる配列①の初期化(2要素)
name[1] = new string[3]{"吉田", "佐藤", "池田"}; //含まれる配列②の初期化(3要素)
for (int i = 0; i < name[0].Length; i++) { //含まれる配列①の要素数について繰返す
Console.WriteLine(name[0][i]); //含まれる配列①の要素を表示
}
for (int i = 0; i < name[1].Length; i++) { //含まれる配列②の要素数について繰返す
Console.WriteLine(name[1][i]); //含まれる配列①の要素を表示
}
}
}
提出:アレンジ演習:p.146 jagged02.cs
・2つあるforを2重ループにして見やすくしよう
・ヒント:下記の●を0から1まで繰返せばよい
for (int j = 0; j < name[●].Length; j++) { //含まれる配列の要素数について繰返す
Console.WriteLine(name[●][j]); //含まれる配列の要素を表示
}