講義メモ:後半

p.176 既存のクラスを使ってみる

・ここまでで、System、Mathなどの既存のクラスを利用しているが、ここでは、インスタンスメソッドを持つクラスの一例として、
 ArrayListクラスを用いよう
・ArrayListクラスは、配列の機能を拡張した仕組みを提供するもので、配列にはない柔軟な利用が可能
・利用には「using Sytem.Collections;」を指定する
 ※ ArrayListクラスなどのデータ構造を表すことのできるクラスをコレクションと呼ぶ
・インスタンスを生成すると、配列に似たデータ構造が生成されるが、配列とは異なり、要素数を事前に決める必要がなく、
 動的に変更することもできる
・要素の追加にはインスタンスメソッドのAdd(データ)を用い、追加にしたがって要素数が拡張される
・件数を返すCountプロパティも利用可能
 ※ プロパティは特殊なメソッドで8章で説明
・格納済の要素は、配列と同様にオブジェクト名[添字]で直接アクセスできる

p.177 arraylist01.cs

//p.177 arraylist01.cs
using System;
using System.Collections; //ArrayList用
class arraylist01 {
    public static void Main() {
        bool bEnd = false; //終了フラグをオフで初期化
        string strData; //読込用
        double sum = 0.0; //合計
        ArrayList al = new ArrayList(); //ArrayListオブジェクトを生成
        while (true) { //無限ループ
            Console.Write("データ(数値以外入力で終了)-- ");
            strData = Console.ReadLine();
            if (!Char.IsDigit(strData[0]) && strData[0] != '-') { //1文字目が数字ではなくマイナスでもない?
                bEnd = true; //終了フラグをオンにする
            } else { //数字またはマイナスなら
                al.Add(double.Parse(strData)); //実数に変換してArrayListに格納
            }
            if (bEnd) { //終了フラグがオン?
                break; //繰返しを抜ける
            }
        }
        for (int i = 0; i < al.Count; i++) { //ArrayListに格納した件数の分、繰返す
            Console.WriteLine("Data[{0}] = {1}", i + 1, al[i]); //値を表示
            sum += (double)al[i]; //合計に足し込む
        }
        int count = al.Count; //ArrayListに格納した件数を得る
        double avr = sum / count; //合計を件数で割って平均値を得る
        Console.WriteLine("データ個数 = {0}", count);
        Console.WriteLine("平均値 = {0}", avr);
    }
}

アレンジ演習:p.177 arraylist01.cs

・Countプロパティを2回呼び出しているが、1回にしよう
・終了フラグを廃止しよう

作成例

//アレンジ演習:p.177 arraylist01.cs
using System;
using System.Collections; //ArrayList用
class arraylist01 {
    public static void Main() {
        string strData; //読込用
        double sum = 0.0; //合計
        ArrayList al = new ArrayList(); //ArrayListオブジェクトを生成
        while (true) { //無限ループ
            Console.Write("データ(数値以外入力で終了)-- ");
            strData = Console.ReadLine();
            if (!Char.IsDigit(strData[0]) && strData[0] != '-') { //1文字目が数字ではなくマイナスでもない?
                break; //【移動】繰返しを抜ける
            } else { //数字またはマイナスなら
                al.Add(double.Parse(strData)); //実数に変換してArrayListに格納
            }
        }
        int count = al.Count; //【移動】ArrayListに格納した件数を得る
        for (int i = 0; i < count; i++) { //【変更】件数の分、繰返す
            Console.WriteLine("Data[{0}] = {1}", i + 1, al[i]); //値を表示
            sum += (double)al[i]; //合計に足し込む
        }
        Console.WriteLine("データ個数 = {0}", count);
        Console.WriteLine("平均値 = {0}", sum / count); //【変更】合計を件数で割って平均値を得る
    }
}

p.180 練習問題1 ヒント

・クラス名や変数名は自由
・例: class MyClass { public int i; }
・読みだした値は確認用に表示すると良い

作成例

//p.180 練習問題1
using System;
class MyClass { public int i; } //int型のpublicインスタンス変数のみを持つクラス
class ex0701 {
    public static void Main() {
        MyClass mc = new MyClass(); //MyClassオブジェクトを生成
        mc.i = 10;
        Console.WriteLine("mc.i = {0}", mc.i);
    }
}

p.180 練習問題2 ヒント

・クラス名やメソッド名は自由
・ただし、オーバーロードなので、同じメソッド名とすること
・Mainメソッドから呼び出すために、2つのメソッドはpublicにする
・int型とint型の和を求めるメソッドは戻り値型もintにする
・double型とdouble型の和を求めるメソッドは戻り値型もdoubleにする
・結果は確認用に表示すると良い

作成例

//p.180 練習問題2
using System;
class MyClass {
    public int sum(int a, int b) { //メソッド①
        return a + b;
    }
    public double sum(double a, double b) { //メソッド②=①のオーバーロード
        return a + b;
    }
}
class ex0702 {
    public static void Main() {
        MyClass mc = new MyClass(); //MyClassオブジェクトを生成
        Console.WriteLine("整数 {0} + {1} = {2}", 2, 3, mc.sum(2, 3)); //メソッド①が呼ばれる
        Console.WriteLine("実数 {0} + {1} = {2}", 3.14, 4.99, mc.sum(3.14, 4.99)); //メソッド②が呼ばれる
    }
}

第8章 クラスとメソッドの詳細

p.181 メソッドの再帰呼び出し

・最近のプログラム言語では、あるメソッドの中で自分自身を呼び出すことが可能で、これを再帰という。
・再帰を上手く利用すると、プログラムをシンプルに記述出来る場合がある
・単純に自分自身を呼び出すと呼び出しが無限ループするので(これ以上)自分を呼び出さずに式や値を返す処置が必要

p.181 階乗を計算する

・階乗とは、ある正の整数において、その数から1までの全整数の積
 ※ 実質的にはその数から2までの全整数の積になる
・整数nの階乗を「n!」で表し、例えば、2!は2、3!は6、4!は24、5!は120、…
・これを逆順で展開すると
 5! = 5×4×3×2×1
 4! =    4×3×2×1
 3! =       3×2×1
・なので、5!=5×4!、4!=4×3! であることから「n! = n×(n-1)!」が導ける。
・これをメソッドFactにすると、
 int CalcFact(int n) { //nの階乗
  return n * CalcFact(n - 1); //n×(n-1)!を返す(再帰する)
 }
・これに、再帰の終了条件として「0の階乗は1」を加えると良い
 int CalcFact(int n) { //nの階乗
  return (n > 0) ? n * CalcFact(n - 1) : 1; //nが0超ならn×(n-1)!を返す(再帰する)でなければ1を返す
 }
・p.182 fact01.csは上記を展開したメソッドになっている

p.182 fact01.cs

//p.182 fact01.cs
using System;
class Fact {
    public long CalcFact(int n) { //n!を返す
        long fact; //階乗値
        if (n == 0) { //0!は1なので(再帰の終了条件になる)
            fact = 1; //1を返す
        } else { //1以上ならば
            fact = n * CalcFact(n - 1); //「n! = n * (n - 1)!」により再帰する
        }
        return fact; //階乗値を返す
    }
}
class fact01 {
    public static void Main() {
        Fact f = new Fact();
        for (int i = 0; i <= 20; i++) {
            Console.WriteLine("{0}! = {1}", i, f.CalcFact(i));
        }
    }
}

アレンジ演習:p.182 fact01.cs

・CalcFact(int n)メソッドを上記を用いてシンプルにしよう

提出:アレンジ演習:p.182 fact01.cs

コメントを残す

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