講義メモ

・p.133「配列とは」(つづき)で「配列の初期化」「配列のプロパティ」から

p.133 配列とは(再掲載+α)

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

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種であるプロパティが利用できる
・配列のプロパティの1つがLengthで、これを用いると要素数がわかる
・これを用いると、配列の要素数が変わっても処理の記述が変わらない=変化に強いプログラムになる
・例: for (int i = 0; i < 配列.Length; i++) { 配列の全要素についての処理 }

p.136 average02.cs

 //p.136 average02.cs
using System;
class average02
{
    public static void Main()
    {
        int[] point = {70, 80, 50}; //int型の配列を3要素で初期化
        int sum = 0, no; //合計、要素数
        no = point.Length; //プロパティを用いて配列の要素数を得る(2回使うので前もって得ておく)
        for (int i = 0; i < no; i++) { //全要素no個について繰返す
            sum += point[i]; //合計に足しこむ
        }
        double average = (double)sum / no; //合計を要素数で割って実数にキャストして平均を得る
        Console.WriteLine("合計 = {0}, 平均 = {1:##.#}", sum, average);  //平均は小数点以下1桁で
    }
}

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

・要素数の変数を配列の要素数で初期化しよう
・また、平均の表示において平均値を得るようにしよう

作成例

//p.136 average02.cs
using System;
class average02
{
    public static void Main()
    {
        int[] point = {70, 80, 50}; //int型の配列を3要素で初期化
        int sum = 0, no = point.Length; //合計、要素数(プロパティを用いて得る)
        for (int i = 0; i < no; i++) { //全要素no個について繰返す
            sum += point[i]; //合計に足しこむ
        }
        Console.WriteLine("合計 = {0}, 平均 = {1:##.#}", sum, (double)sum / no);  //平均は小数点以下1桁で
    }
}

p.137 2次元配列

・C#には2種類の2次元配列があり、通常は●×■個の要素を持つのが2次元配列
・例えば階ごとの部屋数が決まっているダンジョンであれば「●階×■部屋」で表すことができる
・宣言の書式: 型[,] 配列名; //例: string[,] names; 2次元配列namesの宣言
・生成の書式: 配列名 = new 型[要素数①,要素数②]; //例: names = new string[4, 5]; namesとして文字列4×5個分
・宣言と生成は1文で行える 例:string[,] names = new string[4, 5];
・2次元配列の生成時にも初期値を与える(初期化する)ことが可能
・書式: 型[,] 配列名 = {{値,…},…};
 例: string[,] names = {{"ザク","グフ","ドム"},{"ガンダム","ガンタンク,"ガンキャノン"}}; //2×3要素になる
※ C/C++/Javaでは配列名[0][0]と表記するがC#では異なる。なお、この表記を用いるジャグ配列もある(後述)

p.138 array01.cs

//p.138 array01.cs
using System;
class array01
{
    public static void Main()
    {
        int[,] MyArray = new int[2,3]; //2×3要素の2次元配列の生成
        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;
        for (i = 0; i < 2; i++) { //添字①について繰り返す(0,1)
            for (j = 0; j < 3; j++) { //添字②について繰り返す(0,1,2)
                Console.WriteLine("MyArray[{0}, {1}] = {2}", i, j, MyArray[i, j]);                    
            }
        }
    }
}

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

・forのカウンタ用変数をfor文の中で定義しよう
・要素の値を代入する6行を2重ループにしよう(表示用ループとは別に作る事)

作成例

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

p.139 12行目正誤

・誤「全部の要素の初期値を書く必要はありません。初期値が指定されていない要素は0で初期化されます」
・正「指定された要素数と、初期値数が合っていないとエラーになります(p.135参照)」

p.139 array02.cs

//p.139 array02.cs
using System;
class array01
{
    public static void Main()
    {
        int[,] MyArray = { { 1,2,3 },{ 4,5,6 } }; //2×3要素の2次元配列の初期化
        for (int i = 0; i < 2; i++) { //添字①について繰り返す(0,1)
            for (int j = 0; j < 3; j++) { //添字②について繰り返す(0,1,2)
                Console.WriteLine("MyArray[{0}, {1}] = {2}", i, j, MyArray[i, j]);                    
            }
        }
    }
}

p.140 array03.cs

//p.140 array03.cs
using System;
class array03 {
    public static void Main() {
        string[,] Name = new string[2, 5] { //2×5の2次元配列の初期化
            {"田中六郎", "吉田一郎", "太田太郎", "粂井康孝", "岡田三郎"},
            {"横田芳子", "池田和子", "目黒貴和子", "武田信子", "園田淳子"}
        };
        int MyClass, No; //作業用
        string strClass, strNo; //入力用
        while (true) { //無限ループ
            Console.Write("クラスは---");
            strClass = Console.ReadLine();
            if (strClass.Length >= 2) { //入力文字列の長さが2以上?
                Console.WriteLine("入力は1桁のみです");
                continue; //これ以降をスキップして(breakせずに)次の繰り返しへ
            }
            if (Char.IsNumber(strClass, 0) != true) { //文字列の0文字目が数字ではない?
                Console.WriteLine("数字を入力してください");
                continue; //これ以降をスキップして(breakせずに)次の繰り返しへ
            }
            MyClass = Int32.Parse(strClass); //整数に変換
            if (MyClass <= 0 || MyClass >= 3) { //0以下または3以上ならば
                Console.WriteLine("クラスは1組か2組です");
                continue; //これ以降をスキップして(breakせずに)次の繰り返しへ
            }
            break; //ここまでのチェックを通過した=OKなので無限ループを抜ける
        }
        while (true) { //無限ループ
            Console.Write("出席番号は---");
            strNo = Console.ReadLine();
            if (strNo.Length >= 2) { //入力文字列の長さが2以上?
                Console.WriteLine("入力は1桁のみです");
                continue; //これ以降をスキップして(breakせずに)次の繰り返しへ
            }
            if (Char.IsNumber(strNo, 0) != true) {//文字列の0文字目が数字ではない?
                Console.WriteLine("数字を入力してください");
                continue; //これ以降をスキップして(breakせずに)次の繰り返しへ
            }            
            No = Int32.Parse(strNo);//整数に変換
            if (No <= 0 || No >= 6) { //0以下または6以上ならば
                Console.WriteLine("出席番号は1番から5番までです");
                continue; //これ以降をスキップして(breakせずに)次の繰り返しへ
            }
            break; //ここまでのチェックを通過した=OKなので無限ループを抜ける
        }
        Console.WriteLine("{0}クラスの出席番号{1}番は{2}さんです",
                strClass, strNo, Name[MyClass - 1, No - 1]); //添字にするために双方から-1すること
    }
}

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

・現状では何も入力しないでEnterするとChar.IsNumberメソッドで異常終了してしまう。
・「if (●.Length >= 2) { //入力文字列の長さが2以上?」を「if (●.Length != 1) { //入力文字列の長さが1ではない?」と書き換えて解決しよう。
・また1文字であることが確定した後であれば、クラスは「"1"でも"2"でもない?」、出席番号は「先頭文字が'1'未満または'5'超ならば」と記述できることを確認しよう。

作成例

//p.140 array03.cs
using System;
class array03 {
    public static void Main() {
        string[,] Name = new string[2, 5] { //2×5の2次元配列の初期化
            {"田中六郎", "吉田一郎", "太田太郎", "粂井康孝", "岡田三郎"},
            {"横田芳子", "池田和子", "目黒貴和子", "武田信子", "園田淳子"}
        };
        int MyClass, No; //作業用
        string strClass, strNo; //入力用
        while (true) { //無限ループ
            Console.Write("クラスは---");
            strClass = Console.ReadLine();
            if (strClass.Length != 1) { //【変更】入力文字列の長さが1ではない?
                Console.WriteLine("入力は1桁のみです");
                continue; //これ以降をスキップして(breakせずに)次の繰り返しへ
            }
            if (!(strClass == "1" || strClass == "2")) { //【変更】文字列が"1"でも"2"でもない?
                Console.WriteLine("クラスは1組か2組です");
                continue; //これ以降をスキップして(breakせずに)次の繰り返しへ
            }
            MyClass = Int32.Parse(strClass); //整数に変換
            break; //ここまでのチェックを通過した=OKなので無限ループを抜ける
        }
        while (true) { //無限ループ
            Console.Write("出席番号は---");
            strNo = Console.ReadLine();
            if (strNo.Length != 1) { //【変更】入力文字列の長さが1ではない?
                Console.WriteLine("入力は1桁のみです");
                continue; //これ以降をスキップして(breakせずに)次の繰り返しへ
            }
            if (strNo[0] < '1' || strNo[0] > '5') { //【変更】先頭文字が'1'未満または'5'超ならば
                Console.WriteLine("出席番号は1番から5番までです");
                continue; //これ以降をスキップして(breakせずに)次の繰り返しへ
            }
            No = Int32.Parse(strNo);//整数に変換
            break; //ここまでのチェックを通過した=OKなので無限ループを抜ける
        }
        Console.WriteLine("{0}クラスの出席番号{1}番は{2}さんです",
                strClass, strNo, Name[MyClass - 1, No - 1]); //添字にするために双方から-1すること
    }
}

コメントを残す

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