講義メモ 後半

p.144 ジャグ配列

・多次元配列を「要素数の積」ではなく「配列の配列」で表すものがジャグ配列
・型が同じであれば、要素数の異なる配列を含む多次元配列ができるので、メモリの利用効率が良い
・2次元のジャグ配列の場合、要素は配列名[添字①][添字②]と表す。
・例えば、中学校の学年ごとのクラスの人数を表すとき、1年が2クラス、2年が3クラス、3年が1クラスなら:
 1年 : n[0][0]、n[0][1]
 2年 : n[1][0]、n[1][1]、n[1][2]
 3年 : n[2][0]
以下は2次元のジャグ配列の場合:
・宣言の書式: 型[][] 配列名;
・外側の生成の書式: 配列名 = new 型[要素数][]; //2つめの要素数は自由なので指定不要
・内側の生成の書式: 配列名[添字] = new 型[要素数]; //これを1つめの要素数の文、繰返す
・宣言と外側の生成の例: int[][] n = new int[3][]; //3つの配列による2次元のジャグ配列の宣言と生成
・初期化は煩雑だが内側の配列に対して行うことで可能
 例: int[][] n = new int[3] { new int[2]{15, 16}, new int[3]{17, 18, 19}, new int[1]{20} }
・なお、内側の配列に対しての代入が可能
 例: n[0] = new int[2]{15, 16}; 

アレンジ演習:p.144 jagged01.cs

・全要素の合計値も表示しよう

作成例

//アレンジ演習:p.144 jagged01.cs
using System;
class jagged01 {
    public static void Main() {
        int[][] ar; //ジャグ配列の宣言
        ar = new int[2][]; //外側[0],[1]の生成
        ar[0] = new int[3]; //内側[0][0],[0][1],[0][2] の生成
        ar[1] = new int[3]; //内側[1][0],[1][1],[1][2] の生成
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 3; j++) {
                ar[i][j] = (i + 1) * (j + 1); //添字を用いて値(1,2,3,2,4,6)を得て順に格納
            }
        }
        int sum = 0; //【追加】合計用
        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]);
                sum += ar[i][j];
            }
        }
        Console.WriteLine("合計:{0}", sum);  
    }
}

p.146 ジャグ配列(要素数)

・ジャグ配列のLengthプロパティは通常の配列とは仕様が異なる
・ジャグ配列名.Length:ジャグ配列に含まれる配列の数
 例: int[][] ar = new int[3][]; であれば、ar.Lengthは3
・ジャグ配列名[添字].Length:ジャグ配列名[添字]に含まれる要素の数
・よって、ジャグ配列の全要素について繰返す場合、forの2重ループを下記のように用いると良い
 for (int i = 0; i < ジャグ配列名.Length; i++) {
  for (int j = 0; j < ジャグ配列名[i].Length; j++) { //内側の要素数だけ繰返す
   繰返す処理
  }
 }

アレンジ演習:p.146 jagged02.cs

・表示処理をforの2重ループで書き直そう

作成例

//アレンジ演習:p.146 jagged02.cs
using System;
class jagged02 {
    public static void Main() {
        string[][] name = new string[2][]; //ジャグ配列
        name[0] = new string[2]{"田中", "工藤"};
        name[1] = new string[3]{"吉田", "佐藤", "池田"};
        for (int i = 0; i < name.Length; i++) { //含まれる全配列について繰返す
            for (int j = 0; j < name[i].Length; j++) { //配列[i]の全要素について繰返す
                Console.WriteLine(name[i][j]);
            }
        }
    }
}

p.147 暗黙の型指定がなされた配列

・p.61で説明したvarキーワードを用いて、配列の初期化における型も暗黙の型指定が可能
・例: string[] name = {"A", "B"}; ⇒ var name = new []{"A", "B"};
 ※ 2次元配列やジャグ配列でも可能
・なお、配列名.GetType()を実行すると「型情報[]」が返される

アレンジ演習:p.147 var03.cs

・配列nameを[2, 2]の2次元配列にして動作を確認しよう
・また、配列fを[2][]のジャグ配列にして動作を確認しよう
※ 「int Main()」となっているが「void Main()」で良く「return 0;」も不要

作成例

//アレンジ演習:p.147 var03.cs
using System;
class var03 { 
    public static void Main() {
        var name = new [,]{ {"太郎", "次郎" }, {"三郎", "四郎" } }; //2次元配列
        for (var i = 0; i < name.Length; i++) { //全要素について繰返す
            Console.WriteLine(name[i / 2, i % 2]); //[0,0][0,1][1,0][1,1]の順に表示
        }
        var f = new[] { new [] {0.5, 0.9 }, new [] {1.5, 2.3 } }; //ジャグ配列
        for (var i = 0; i < f.Length; i++) { //全配列について繰返す
            for (var j = 0; j < f[i].Length; j++) { //各配列の全要素について繰返す
                Console.WriteLine(f[i][j]);
            }
        }
        Console.WriteLine("nameの型は{0}, fの型は{1}", name.GetType(), f.GetType());
    }
}

p.148 1次元配列のソート

・C#が提供するArrayクラスのSortメソッドを用いると、1次元配列の昇順ソート(整列)が可能
・書式: Array.Sort(1次元配列名)
・また、ArrayクラスのReverseメソッドを用いると、1次元配列の逆順化が可能
・書式: Array.Reverse(1次元配列名)
・よって、上記を順に行うことで、降順ソートも可能

アレンジ演習:p.148 sort01.cs

・5人の名前を全て小文字にした要素を追加して10要素にし、どう整列されるか確認しよう
 ⇒小文字と大文字は同じ順序だが、同じ字の小文字と大文字では小文字の方が前になる
・英記号「!,#,$,%,&」がどう整列されるか確認しよう
 ⇒文字コード順になる(文字コードは順に 21,23,24,25,26)
・負の数を含む実数値の場合、どう整列されるか確認しよう
 ⇒小さい(-∞に近い)ものからの順になる
・「ちぢっつづてで」のように小文字や濁点を含むひらがなの場合、どう整列されるか確認しよう
 ⇒文字コード順になる(文字コードは順に 3061,3062,3063,3064,3065,3066,3067)

提出:アレンジ演習:p.148 sort01.cs(内容は自由)

コメントを残す

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