講義メモ 後半

p.195 メソッドのオーバーロード

・p.168で説明のとおり、引数の型や数が異なるコンストラクタを記述できることをオーバーロード
・これは、メソッドでも可能なので、同じ意味の処理を行うメソッドは同じ名前にすると良い
 ※ オーバーロードができないC言語では関数名が長くなるというデメリットがある
・コンストラクタと同様にシグニチャが異なればOKだが、メソッドの戻り値型はシグニチャに含まれないので注意
・これは戻り値型だけが異なるメソッドは呼び出し時に区別できないため

p.195 overload01.cs

//p.195 overload01.cs
using System;
class manymethods {
    public int Method(int x) { //メソッド①
        Console.WriteLine("第1のバージョンが呼ばれました");
        return x + 10;
    }
    public double Method(double x) { //メソッド②
        Console.WriteLine("第2のバージョンが呼ばれました");
        return x * 2;
    }
    public string Method(string x) { //メソッド③
        Console.WriteLine("第3のバージョンが呼ばれました");
        return x += "です";
    }
    public int Method(int x, int y) { //メソッド④
        Console.WriteLine("第4のバージョンか呼ばれました");
        return x + y;
    }
}
class overload01 {
    public static void Main() {
        manymethods m = new manymethods();
        Console.WriteLine("その戻り値は「{0}」です", m.Method(3)); //①を呼ぶ
        Console.WriteLine("その戻り値は「{0}」です", m.Method(3.2)); //②を呼ぶ
        Console.WriteLine("その戻り値は「{0}」です", m.Method("粂井")); //③を呼ぶ
        Console.WriteLine("その戻り値は「{0}」です", m.Method(5, 6)); //④を呼ぶ
    }
}

アレンジ演習:p.195 overload01.cs

・下記のシグニチャを持ち、最大値を返すMaxメソッドのオーバーロードに書き換えよう
① int Max(int, int)
② int Max(int, int, int)
③ double Max(double, double, double, double)
④ double Max(double[])

作成例

//アレンジ演習:p.195 overload01.cs
using System;
class manyMaxs {
    public int Max(int x, int y) { //メソッド①
        return (x > y) ? x : y; //大きい方を返す
    }
    public int Max(int x, int y, int z) { //メソッド②
        return (x > y) ? ((x > z) ? x: z) : ((y > z) ? y : z); //最大値を返す
    }
    public double Max(double x, double y, double z, double w) { //メソッド③
        double max1 = (x > y) ? x : y; //xとyの大きい方を得る
        double max2 = (z > w) ? z : w; //zとwの大きい方を得る
        return (max1 > max2) ? max1 : max2; //上記2者の大きい方を返す
 
    }
    public double Max(double[] d) { //メソッド④
        double max = double.MinValue;
        foreach (var w in d) { //全要素について作業変数wに取り出しながら繰返す
            if (w > max) {
                max = w; //最大値更新
            }
        }
        return max;
    }
}
class overload01 {
    public static void Main() {
        manyMaxs m = new manyMaxs();
        Console.WriteLine("max(3, 5):{0}", m.Max(3, 5)); //①を呼ぶ
        Console.WriteLine("max(3, 7, 1):{0}", m.Max(3, 7, 1)); //②を呼ぶ
        Console.WriteLine("max(3.14, 5.25, 7.79, -2.1):{0}", m.Max(3.14, 5.25, 7.79, -2.1)); //③を呼ぶ
        double[] da = {3.14, 5.25, 7.79, -2.1, 9.25};
        Console.WriteLine("max(3.14, 5.25, 7.79, -2.1, 9.25):{0}", m.Max(da)); //④を呼ぶ
    }
}

アレンジ演習:p.195 overload01.cs

・最大値を求める処理を1つにしよう
・①②③の引数をdouble型の配列に格納して④を呼ぶと良い

作成例

//アレンジ演習:p.195 overload01.cs
using System;
class manyMaxs {
    public int Max(int x, int y) { //メソッド①
        double[] wa = {x, y}; //引数を配列化する
        return (int)Max(wa); //メソッド④を呼ぶ
    }
    public int Max(int x, int y, int z) { //メソッド②
        double[] wa = {x, y, z}; //引数を配列化する
        return (int)Max(wa); //メソッド④を呼ぶ
    }
    public double Max(double x, double y, double z, double w) { //メソッド③
        double[] wa = {x, y, z, w}; //引数を配列化する
        return Max(wa); //メソッド④を呼ぶ 
    }
    public double Max(double[] d) { //メソッド④
        double max = double.MinValue;
        foreach (var w in d) { //全要素について作業変数wに取り出しながら繰返す
            if (w > max) {
                max = w; //最大値更新
            }
        }
        return max;
    }
}
class overload01 {
    public static void Main() {
        manyMaxs m = new manyMaxs();
        Console.WriteLine("max(3, 5):{0}", m.Max(3, 5)); //①を呼ぶ
        Console.WriteLine("max(3, 7, 1):{0}", m.Max(3, 7, 1)); //②を呼ぶ
        Console.WriteLine("max(3.14, 5.25, 7.79, -2.1):{0}", m.Max(3.14, 5.25, 7.79, -2.1)); //③を呼ぶ
        double[] da = {3.14, 5.25, 7.79, -2.1, 9.25};
        Console.WriteLine("max(3.14, 5.25, 7.79, -2.1, 9.25):{0}", m.Max(da)); //④を呼ぶ
    }
}

別解(メソッド①②③の中身を1行に)

//アレンジ演習:p.195 overload01.cs
using System;
class manyMaxs {
    public int Max(int x, int y) { //メソッド①
        return (int)Max(new double[]{x, y}); //メソッド④を呼ぶ
    }
    public int Max(int x, int y, int z) { //メソッド②
        return (int)Max(new double[]{x, y, z}); //メソッド④を呼ぶ
    }
    public double Max(double x, double y, double z, double w) { //メソッド③
        return Max(new double[]{x, y, z, w}); //メソッド④を呼ぶ
    }
    public double Max(double[] d) { //メソッド④
        double max = double.MinValue;
        foreach (var w in d) { //全要素について作業変数wに取り出しながら繰返す
            if (w > max) {
                max = w; //最大値更新
            }
        }
        return max;
    }
}
class overload01 {
    public static void Main() {
        manyMaxs m = new manyMaxs();
        Console.WriteLine("max(3, 5):{0}", m.Max(3, 5)); //①を呼ぶ
        Console.WriteLine("max(3, 7, 1):{0}", m.Max(3, 7, 1)); //②を呼ぶ
        Console.WriteLine("max(3.14, 5.25, 7.79, -2.1):{0}", m.Max(3.14, 5.25, 7.79, -2.1)); //③を呼ぶ
        double[] da = {3.14, 5.25, 7.79, -2.1, 9.25};
        Console.WriteLine("max(3.14, 5.25, 7.79, -2.1, 9.25):{0}", m.Max(da)); //④を呼ぶ
    }
}

p.197 Mainメソッドのオーバーロード

・Mainメソッドは特殊なメソッドであり、プログラムの動作開始位置の指定を行う
・Mainメソッドはpublic staticであり、戻り値はvoidまたはint、引数は無しまたは文字列配列であれば良い
・戻り値をintにすると、プログラムの呼び出し側に整数値を返すことができる
・プログラムの呼び出し側がOSの場合は正常終了した0を、でなければ0以外をreturnすると良い
・この値はシステム変数「errorlebel」で参照できるので、直後にコマンド「echo %errorlebel%」を実行すると得られる
・引数を文字列配列にすると、呼び出し時に0個以上の文字列を与えることができ、メソッド内で受け取って利用できる
・この文字列をコマンドライン引数といい、Visual Studioではデバッグのプロパティで指定可能
・コマンドプロンプトなどの外部処理からプログラムを実行可能であり、この時はプログラム名に続けてコマンドライン引数を指定可能
・なお、コマンドライン引数の数は不定なので、Lengthプロパティで要素数を得て用いると良い

p.198 main01.cs

//p.198 main01.cs
using System;
class main01 {
    public static int Main(string[] s) { //コマンドライン引数を受け取り整数を返す
        int n;
        n = s.Length; //コマンドライン引数の数を得る
        Console.WriteLine("引数の個数は{0}個です", n);
        if (n != 0) { //コマンドライン引数が指定されている?
            for (int i = 0; i < n; i++) { //全引数について繰返す
                Console.WriteLine("引数{0} : {1}", i + 1, s[i]);
            }
        }
        return 0; //正常終了を返す
    }
}

補足:コマンドラインからの実行方法

①「ツール」「コマンドライン」「開発者用コマンドプロンプト」
② cd プロジェクト名\bin\debug(例: cd chap8\bin\debug)
③ プロジェクト名に続けてコマンドライン引数を記述する(例: chap8 cat dog apple)
※ この環境では「\」が「/」の反対(バックスラッシュ)になるが同じ文字コードなので問題ない

p.200(バッチファイル)

・複数のコマンドをまとめて実行したい場合に、これらを記述して「●.bat」として保存するとバッチファイルとみなされる
・コマンドプロンプトでバッチファイル名をそのまま記述するだけで、内容が実行される

補足:バッチファイルの作成例

・開発者用コマンドプロンプトを起動して「notepad a.bat」「はい」でバッチファイルが作成可能になる
・下記を記述して「ファイル」「保存」して閉じる

ver
dir
date

・「a.bat」と入力すると、バージョン情報、ファイル一覧、日付確認の順に動作する
 ※日付確認はEnterキーを押すだけでOK

p.199 main02.csの実行方法

p.199「main02.cs」は、p.200のバッチファイル「main02test.bat」で実行する
①「main02.cs」は「デバッグなしで実行」は行わず「ビルド」「ソリューションのビルド」のみを行い、実行可能にしておく
②「ツール」「コマンドライン」「開発者用コマンドプロンプト」
③ cd プロジェクト名\bin\debug(例: cd chap8\bin\debug)
④ notepad main02test.bat
⑤ p.200のバッチファイル「main02test.bat」の内容をコピーペースト
⑥ この中の「main02」を全てプロジェクト名に書き換える
⑦「ファイル」「名前をつけて保存」して閉じる(このときエンコードを「ANSI」に変更すること)
⑧ main02test.bat

p.200のバッチファイル「main02test.bat」

@rem main02test.bat
@echo off
main02
echo %errorlevel%
echo 「main02.exe」の呼び出し結果です
main02
echo %errorlevel%
echo 「main02.exe」の呼び出し結果です
main02 a
echo %errorlevel%
echo 「main02.exe a」の呼び出し結果です
main02 20 30
echo %errorlevel%
echo 「main02.exe 20 30」の呼び出し結果です
main02 30
echo %errorlevel%
echo 「main02.exe 30」の呼び出し結果です

提出:p.199 main02.cs

コメントを残す

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