アレンジ演習:p.163 bmiclass.cs
・身長や体重に0以下の値が入力されたら、先に進まずに再入力させるようにしよう
作成例
//アレンジ演習:p.163 bmiclass.cs
using System;
class BMI { //部品クラス
private double blm; //身長(m単位):内部計算用のインスタンス変数なのでprivate
public double Calc(double bl, double bw) { //身長(cm)と体重(kg)を受け取ってBMIを返すインスタンスメソッド
blm = bl / 100.0; //身長(cm)を身長(m)に換算
return bw / Math.Pow(blm, 2.0); //体重を身長(m)の自乗で割ってBMIを得て返す
}
}
class bmiclass { //実行用クラス
public static void Main() { //実行用の特別メソッド
string strBl, strBw; //入力用のローカル変数
double blcm, bwkg; //実数変換用のローカル変数
do { //入力ループ①
Console.Write("身長(cm)---");
strBl = Console.ReadLine();
blcm = Double.Parse(strBl); //実数変換
} while (blcm <= 0); //0以下が入力されていたら繰返す
do { //入力ループ②
Console.Write("体重(kg)---");
strBw = Console.ReadLine();
bwkg = Double.Parse(strBw); //実数変換
} while (bwkg <= 0); //0以下が入力されていたら繰返す
BMI bmi = new BMI(); //部品クラスのインスタンスオブジェクトを生成
Console.WriteLine("BMIは{0:#.##}です", bmi.Calc(blcm, bwkg)); //BMIを得て小数点以下2桁で表示
}
}
アレンジ演習:p.165 noreturnvalue.cs
・記述されている5つの「return」が全て不要であることを確認しよう ※「return」が常に不要という意味ではなく、メソッドの途中で呼び出し元に戻りたい場合に利用可能 ※ このプログラムの5つの「return」はメソッドの末尾や、メソッドの末尾に向かう位置にあるので不要
作成例
//アレンジ演習:p.165 noreturnvalue.cs
using System;
class Kakeibo { //部品クラス「家計簿」
private int total = 0; //内部処理用のprivateなインスタンス変数(残高)
public void nyukin(int en) { //入金処理のインスタンスメソッド
total += en; //引数で得た入金額を残高に足し込む
Console.WriteLine("{0}円を入金しました", en);
}
public void shishutsu(int en) { //支出処理のインスタンスメソッド
if (total < en) { //引数で得た支出金額より残高が小さい?
Console.WriteLine("{0}円も支出できません", en);
} else { //支出可能?
total -= en; //引数で得た支出金額を残高から差し引く
Console.WriteLine("{0}円を支出しました", en);
}
}
public void gettotal() { //残高を得るインスタンスメソッド
if (total == 0) { //残高なし?
Console.WriteLine("残高はありません");
} else {
Console.WriteLine("残高は{0}円です", total);
}
}
}
class noreturnvalue { //実行用のクラス
public static void Main() { //実行用の特別なメソッド
Kakeibo k = new Kakeibo(); //家計簿クラスのインスタンスを生成
k.gettotal(); //残高を得る(表示)
k.nyukin(1000); //入金処理
k.gettotal(); //残高を得る(表示)
k.nyukin(2000); //入金処理
k.gettotal(); //残高を得る(表示)
k.shishutsu(500); //支出処理
k.gettotal(); //残高を得る(表示)
k.shishutsu(10000); //支出処理
k.gettotal(); //残高を得る(表示)
}
}
p.167 コンストラクタ
・全てのクラスがあらかじめ持っている特別なメソッド
・プログラマが必要に応じて記述することが可能で、そうでなければ自動的に中身が空のものが用意される
・これをデフォルトコンストラクタという
・よって、記述は任意
・メソッドだが、メソッド名はなく、戻り値型もなく、public固定
・コンストラクタはオブジェクトの生成時に自動的に呼び出されるもので、プログラマが任意に呼ぶことはできない
・よって、オブジェクトの生成時に行いたいことを記述するために用いる
例:インスタンス変数の初期化、リソースなどの準備処理 等
・定義書式①: public クラス名() {処理内容}
・システム側で必ず実行されるので、実行漏れを防ぎたい初期化処理などを記述すると良い
アレンジ演習:p.167 construct01.cs
・027行目の下で「MyClass md;」を実行すると、コンストラクタが動作するかどうか確認しよう ⇒ 宣言のみでは動作しない ・また「MyClass md = new MyClass();」を実行すると、コンストラクタが動作するかどうか確認しよう ⇒ オブジェクトを生成するとした数だけ動作する
作成例
//p.167 construct01.cs
using System;
class MyClass { //部品クラス
int x; //インスタンス変数(private扱い)
public void showx() { //インスタンスメソッド
Console.WriteLine("x = " + x); //インスタンス変数を利用
}
public MyClass() { //コンストラクタ
x = 10; //インスタンス変数を利用
Console.WriteLine("xに10を代入しました");
}
}
class construct01 {
public static void Main() {
MyClass mc = new MyClass(); //ここでコンストラクタが動作
mc.showx(); //インスタンスメソッドを呼ぶ
MyClass md = new MyClass(); //【追加】ここでもコンストラクタが動作
}
}
p.167 コンストラクタ:コンストラクタの引数
・メソッドと同様にコンストラクタにも引数が指定できる
・引数を指定したコンストラクタを呼び出すには、newにおいてカッコ内に引数型と引数を記述する
・定義書式②: public クラス名(引数型 引数名, …) {処理内容}
例: public Slime(int h, int p) { hp = h; mp = p; }
・呼び出し法: new クラス名(値や式, …);
提出:アレンジ演習:p.167 construct01.cs