講義メモ

・p.222 練習問題をクリアして、第9章に進みます

p.222 練習問題1 ヒント

・p.209 prop02.csを単純化すると良い
・double型のデータメンバ1つのみになる
・Mainメソッドで負の数や0を与えて動作を確認すること

作成例

//p.222 練習問題1
using System;
class BMI {
    double bw;
    public double bwprop { //プロパティ
        set {
            if (value > 0) { //代入値が正の数なら
                bw = value; //代入値を代入
            }
        }
        get { 
            return bw; //値を返す
        }
    }
}
class prop02 {
    public static void Main() {
        BMI mybmi = new BMI();
        mybmi.bwprop = 5; //プロパティbwpropのsetアクセッサを呼ぶ
        Console.WriteLine(mybmi.bwprop); //プロパティbwpropのgetアクセッサを呼ぶ
        mybmi.bwprop = -5; //プロパティbwpropのsetアクセッサを呼ぶ(負の数なので無視される)
        Console.WriteLine(mybmi.bwprop); //値は変わらない
    }
}

p.222 練習問題2 ヒント

・p.217 indexer03.csをベースにすると良い
・コンストラクタで生徒数を入力する部分は、p.214 indexer02.csが参考になる
・生徒名を格納するstring型配列と、点数を格納するint型配列を宣言して用いると楽
 ※ 生徒名と点数をメンバとするクラスオブジェクトの配列にできればさらに良い
・要素の生成はコンストラクタで行うと良い
・Mainメソッドで格納結果を表示すること

作成例

//p.222 練習問題2
using System;
class MyIndexer {
    int[] point; //点数の配列を宣言
    string[] name; //名前の配列を宣言
    int num; //要素数
    public MyIndexer(int n) { //要素数nを受け取るインデクサ
        point = new int[n]; //点数の配列を生成
        name = new string[n]; //名前の配列を生成
        num = n;
    } 
    public int this[string Name] { //インデクサ①の定義(データはintで、インデックスはstring)
        get {
            for (int i = 0; i < num; i++) { //配列の全要素について繰返す
                if (Name == name[i]) //インデックスと同値?(名前が一致?)
                    return point[i]; //点数を返す
            }
            return -1; //当てはまる名前がなければ-1を返す
        }
        set {
            for (int i = 0; i < num; i++) { //配列の全要素について繰返す
                if (Name == name[i]) //インデックスと同値?(名前が一致?)
                    point[i] = value; //点数を格納
            }

        }
    }
    public string this[int i] { //インデクサ②の定義(データはstringで、インデックスはint)
        get { return name[i]; } //i番の名前を返す
        set { name[i] = value; } //i番の名前を格納
    }
}
class indexer03 {
    public static void Main() {
        MyIndexer mi = new MyIndexer(3); //コンストラクタで3人分を用意
        mi[0] = "Amuro";  //インデクサ②のsetで名前を格納
        mi[1] = "Shar";   //同上
        mi[2] = "Bright"; //同上
        mi["Amuro"] = 60;  //インデクサ①のsetでその名前の点数を格納
        mi["Shar"]  = 70;  //同上
        mi["Bright"] = 80; //同上
        for (int i = 0; i < 3; i++) {
            string myname = mi[i]; //インデクサ②のgetで●番の名前を得る
            int mypoint = mi[myname]; //インデクサ①のgetでその名前の点数を得る
            Console.WriteLine("{0}は{1}点", myname, mypoint); 
        }
    }
}

コメントを残す

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