講義メモ 第6章 配列

p.133 配列とは

・同じ型で同じ意味の変数を「●の■番目」としてまとめて扱える仕掛け。
・この●を配列(名)、■を添字またはインデクスという
・配列を構成するデータを要素、その数を要素数という
・配列の利用には宣言が必要で、それから、要素の数だけの領域を確保する生成を行う
・宣言の書式: 型[] 配列名; //例: string[] names; 文字列配列namesの宣言
・生成の書式: 配列名 = new 型[要素数]; //例: names = new string[100]; namesとして文字列100個分
・宣言と生成は1文で行える 例:string[] names = new string[100];

p.135 配列とは(配列の要素の利用)

・配列名に続けて[添字]をつけることで、配列の要素にアクセスできる。
・添字は0からなので、要素数-1までになることに注意。
・配列名[要素数]は存在せず、アクセスすると異常終了してしまう。
・要素は変数と全く同様に利用できる。
 例: string[] names = new string[3]; names[0] = "Amuro"; names[1] = "Kai"; names[2] = "Ryu";

p.135 配列とは(配列の初期化)

・変数と同様に配列の生成時に初期値を与える(初期化する)ことが可能
・この時、初期値の数を要素数できるので、要素数を省略して良い
・書式: 型[] 配列名 = {値,…};
 例: string[] ms = {"ザク","グフ","ドム"}; //3要素になる
・生成の書式の後ろに{値,…}を指定して初期化できるが、要素数と値の数が合ってないとエラー。

p.135 配列とは(配列のプロパティ)

・C#の配列はクラス(第7章)と同様の「データと処理をもつオブジェクト」として実装されている
・よって、クラスの持つ機能の一種であるプロパティが利用できる
・配列のプロパティの1つがLengthで、これを用いると要素数がわかる
・利用書式: 配列名.Length
・これを用いると、配列の要素数が変わっても処理の記述が変わらない=変化に強いプログラムになる
・例: for (int i = 0; i < 配列.Length; i++) { 配列の全要素についての処理 }

アレンジ演習:p.136 average02.cs

・配列pointの要素を1つ増やして「60」を入れよう
・配列pointの初期化式に要素値を書き加えるのみで良いことを確認しよう

作成例

//アレンジ演習:p.136 average02.cs
using System;
class average02
{
    public static void Main()
    {
        int[] point = {70, 80, 50, 60}; //【変更】int型の配列pointの初期化
        int sum = 0, no; //合計、要素数
        no = point.Length; //配列のプロパティで要素数を得る
        for (int i = 0; i < no; i++) { //全要素について繰返す
            sum += point[i]; //要素値を合計に足しこむ
        }
        double average = (double)sum / no; //実数化して要素数で割ることで平均を実数で得る
        Console.WriteLine("合計 = {0}, 平均 = {1:##.#}", sum, average); //合計と平均を表示
    }
}

p.137 2次元配列

・2次元配列とは添字を2つもつ配列であり、配列名[添字①, 添字②] で表す
・例えば、将棋やチェスやオセロなどの盤や、平面の迷路を表すには2次元配列が向く
・宣言の書式: データ型[,] 配列名;
・生成の書式: 配列名 = new データ型[要素数①, 要素数②];
・配列と同様に、宣言と生成を同時に行える
 例: int[,] map = new int[2, 3]; //2×3の2次元配列の宣言と生成
 これにより、map[0,0],map[0,1],map[0,2],map[1,0],map[1,1],map[1,2]の6要素が生成される
 つまり、添字①の0から1について、それぞれ添字②の0から2までがあるという形式で、下記の表のイメージ。
 +--------+--------+--------+
 |map[0,0]|map[0,1]|map[0,2]|
 +--------+--------+--------+
 |map[1,0]|map[1,1]|map[1,2]|
 +--------+--------+--------+
・2次元配列の全要素を扱う場合、forの2重ループにして、外側で添字①を、内側で添字②を扱うと良い
 書式例:
 for (int i = 0; i < 要素数①; i++) {
  for (int j = 0; j < 要素数②; j++) {
   配列名[i, j]を操作
  }
 }
 この例を当てはめると、map[0,0],map[0,1],map[0,2],map[1,0],map[1,1],map[1,2]の順に扱われる

p.138 array01.csについて

・2重ループにおいては{}の省略は推奨されないことが多い(チームルールによっては禁止)
・特に、このソースの用に繰り返し内容が2行分ある場合、{}を省略すると非常に誤読を招きやすいので注意

アレンジ演習:p.138 array01.cs

・配列myArrayへの要素値の代入も二重ループで行うようにしよう
・要素値はインクリメントを用いると良い

作成例

//アレンジ演習:p.138 array01.cs
using System;
class array01
{
    public static void Main()
    {
        int[,] MyArray = new int[2,3];
        int i, j;
        //MyArray[0, 0] = 1;
        //MyArray[0, 1] = 2;
        //MyArray[0, 2] = 3;
        //MyArray[1, 0] = 4;
        //MyArray[1, 1] = 5;
        //MyArray[1, 2] = 6;
        int n = 1; //要素値
        for (i = 0; i < 2; i++) {
            for (j = 0; j < 3; j++) {
                MyArray[i, j] = n++; //要素値として代入しインクリメント
            }
        }
        for (i = 0; i < 2; i++) {
            for (j = 0; j < 3; j++) {
                Console.WriteLine("MyArray[{0}, {1}] = {2}", i, j, MyArray[i, j]);
            }
        }
    }
}

アレンジ演習:p.138 array01.cs:さらに

・2重ループを1つにまとめ、カウンタの変数の初期化もループ内で行おう

作成例

//アレンジ演習:p.138 array01.cs
using System;
class array01
{
    public static void Main()
    {
        int[,] MyArray = new int[2,3]; //2次元配列MyArray[2,3]の生成
        int n = 1; //要素値
        for (int i = 0; i < 2; i++) { //第1添字の全要素について繰返す
            for (int j = 0; j < 3; j++) { //第2添字の全要素について繰返す
                MyArray[i, j] = n++; //要素値として代入しインクリメント
                Console.WriteLine("MyArray[{0}, {1}] = {2}", i, j, MyArray[i, j]);
            }
        }
    }
}

p.138 2次元配列(初期化)

・1次元の配列と同様に、要素値を並べる事で初期化が可能
・この時、{}をネストにして2次元であることを表すと良い
・書式: データ型[,] 配列名 = { { 値,… }, { 値,… }, … }

アレンジ演習:p.139 array02.cs

・最後に全要素の合計値を表示しよう

作成例

//アレンジ演習: array02.cs
using System;
class array02
{
    public static void Main()
    {
        int[,] MyArray = {{1, 2, 3}, {4, 5, 6}}; //配列の初期化
        int sum = 0; //【追加】合計
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 3; j++) {
                Console.WriteLine("MyArray[{0}, {1}] = {2}", i, j, MyArray[i, j]);
                sum += MyArray[i, j]; //【追加】要素値を合計に足し込む
            }
        }
        Console.WriteLine("合計 = {0}", sum); //【追加】
    }
}

テキスト正誤:p.139 11行目から3行

最初の書き方では要素数が指定されているので、全部の要素の初期値を書く必要があります。
例えば、下記はエラーになります。
 int[,] MyArray = new int[4, 2] {{1, 2, 3}, {4, 5, 6}}; //エラー
よって,C/C++のように「初期値が指定されていない要素は0で初期化される」ことはありません。
 int[,] MyArray = new int[,] {{1, 2, 3}, {4, 5, 6}}; //エラー
とすれば、初期値の数だけの要素を持った配列になります。
なお、この「new int[,]」は省略できます

p.140 array03.cs 補足

・023行目などで用いている「Char.IsNumber(文字列s, 位置n)」は、文字列sの先頭を0文字目とした時のn文字目が、数字かどうかを
 返すメソッド
・よって、位置nが0であれば、文字列の先頭文字が数字であればtrue、でなければfalseを返す
・これで事前にチェックすることで、int.Parseメソッドなどで数値化できる文字列かどうかがわかるので、以上終了を防ぐことができる
・このプログラムでは、事前に1桁であることもチェックしているので、先頭文字のチェックだけで良い

アレンジ演習:p.140 array03.cs

・if文の中で「Char.IsNumber(strClass, 0) != true」などとしているが、「!Char.IsNumber(strClass, 0)」と
 シンプルにできることを確認しよう

提出:アレンジ演習:p.140 array03.cs

コメントを残す

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