report3

今回の課題

1.3種類以上の体積を求めるクラスを作成し、具体的な値を入力しプログラムを実行せよ。

2.2種類以上の表面積を求めるクラスを作成し、同様に実行せよ。

3.例題を参考に、階乗計算を再起プログラムにより作成し、for文による階乗計算との違いを考察せよ。


課題1

3種類以上の体積を求めるクラスを作成し、具体的な値を入力しプログラムを実行せよ。
report3.javaのソース
class point3D { //point3Dというクラスを作成
    double l;   //縦
    double w;   //横
    double h;   //高さ
    double r;   //半径を表す

    point3D(double l,double w,double h, double r) {
        //コンストラクタの追加を行い、4つのdouble型の値を引数として受け取り、
        //インスタンス変数に代入

        this.l = l;//thisキーワードを使ってインスタンス変数を参照する。
        this.w = w;//thisキーワードを使えば、コンストラクタのパラメータ名は、初期化
        this.h = h;//するインスタンス変数名と同じになり、パラメータに別の名前を使う
        this.r = r;//必要がなくなる。
    }
}

class report3 {  //直方体、球、円柱の体積を求めるクラスの作成

    public static void main(String args[]) { 
              //直方体の体積を求めるメソッド
        point3D p1 = new point3D(1.3, 2.5, 0.3, 0);
        System.out.println("volume1 = " + p1.l*p1.w*p1.h);

              //球の体積を求めるメソッド
        point3D p2 = new point3D(0, 0, 0, 3.7);
        System.out.println("volume2 = " + 4*3.14*Math.pow(p2.r,3)/3);

              //円柱の体積を求めるメソッド
        point3D p3 = new point3D(0, 0, 6, 2.1);
        System.out.println("volume3 = " + p3.h*3.14*Math.pow(p3.r,2));

    }
}
report3.javaの実行結果
volume1 = 0.975
volume2 = 212.0672266666667
volume3 = 83.0844

report3.javaの考察

 まず、変数だけのクラス(class point3D)を作成し、コンストラクタを追加した。コンストラクタは、
特定のクラスのオブジェクトを作成して初期化するメソッドで、名前はクラスと同じ。コンストラクタでは、
引数を受け取ることができるが、コンストラクタが返すのはコンストラクタが作成したオブジェクトへの
参照。
 コンストラクタは直接呼び出すことはできないので、常にnew演算子を使って呼び出す。
(main()メソッドの3種の体積を求めるところのコンストラクタの呼び出し参照)

直方体→縦×横×高さ   球→4πr*/3 (r*はrの3乗を指す)   円柱→底面積×高さ

課題2

2種類以上の表面積を求めるクラスを作成し、同様に実行せよ。
report3_2.javaのソース
class point3D {  //point3Dというクラスを作成
    double Pi;   //π(3.14~)
    double h;    //高さ
    double r;    //半径を表す

    point3D(double Pi, double h, double r) {  //コンストラクタの追加
        this.Pi = Pi;
        this.h = h;     //thisキーワードを使い、インスタンス変数を参照
        this.r = r;
    }
}

class report3_2 {  //球、円柱の表面積を求めるクラスの作成
    public static void main(String args[]) {
                 //球の表面積を求めるメソッド
        point3D p1 = new point3D(Math.PI, 0, 4.1);
        System.out.println("Surface area1 = " + 4*p1.Pi*Math.pow(p1.r,2));

                 //円柱の表面積を求めるメソッド
        point3D p2 = new point3D(Math.PI, 5, 3.7);
        System.out.println("Surface area2 = " 2*p2.Pi*p2.r*p2.h+p2.Pi*Math.pow(p2.r,2)*2);
    }
}
report3_2.javaの実行結果
Surface area1 = 211.24069002737767
Surface area2 = 116.2389281828223586.01680685528855

report3_2.javaの考察

課題1とソース自体はなんら変わりはないので、課題1の「report3.javaの考察」を参照して下さい。

球の表面積→4πr*(r*はrの2乗を指す)   円柱の表面積→2πr×高さ + 2×πr*(r*はrの2乗を指す)

課題3

例題を参考に、階乗計算を再起プログラムにより作成し、for文による階乗計算との違いを考察せよ。
sample.javaのソース(サンプルプログラムの穴を埋めたもの)
import java.io.*;

class factrial {

    public static void main(String args[]) throws Exception {

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in)\);

        System.out.print("input natural number: ");
        int num = (new Integer(in.readLine())).intValue();

        System.out.print("for階乗計算      => ");
        System.out.println(num + "! =" + factfor(num));

        System.out.print("階乗計算 => ");
        System.out.println(num + "! =" + factrec(num));

    }

    static int factfor(int number) {

        int factrial = 1;

        for (int i = 1; i <= number; i++) {
            factrial = i * factrial;
        }

        return(factrial);

    }

    static int factrec(int number) {

        if (number == 0) return(1);
        return(number*factrec(number-1));

    }

}
sample.javaの実行結果
input natural number: 3
for階乗計算      => 3! =6
階乗計算 => 3! =6

sample.javaの考察

 サンプルプログラムでは、ユーザが入力した文字列をint型にして、for文の階乗計算と再起プログラム
の階乗計算を行う二つのメソッドに渡している。

for文では、int型変数の値を1に設定し、それを入力された値まで+1づつしていく。
まず、最初の1と+1した値を乗算。乗算した値を同じ変数に入れる。次に、+1した値と+1+1した値を乗算
し、同じ変数に入れる。これを繰り返して、入力された値の階乗計算が行われる。

再起プログラムでは、入力された値をnとすると、F(n)=n*F(n-1)となっていて、F(n-1)には、
F(n-1)=(n-1)*F(n-2)が入っている。このようにして、F(n-2)も同様になっている。この式のnに値を
入れて考えれば、階乗計算が出来ていることがわかる。

感想

今回の課題は、再起プログラムの考察で、どのように説明していいかわからず、苦労した。すこしでも、伝わ
っていると嬉しいです。