講義メモ:後半

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]); //含まれる配列の要素を表示
        }

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です