課題内容
* Report#3:体積・表面積公式クラスの作成{〜12/11(Mon)}
o (1)3種以上の体積を求めるクラスを作成し、具体的な値を入力しプ
ログラムを実行せよ。
o (2)2種以上の表面積を求めるクラスを作成し、同様に実行せよ。
o (3)例題を参考に、階乗計算を再帰プログラムにより作成し、for文
による階乗計算との違いを考察せよ。
o 例題:階乗計算:for文&再帰呼び出し
o 課題のWebページは、必ず別のスタイルシートファイルを用いるこ
と。
(1)3種以上の体積を求めるクラスを作成し、具体的な値を入力しプログラムを
実行せよ。
(1)のソースプログラム
class Point3D {
double x;
double y;
double z;
Point3D(double x) {
this.x = x;
}
Point3D(double x,double y,double z) {
this.x = x;
this.y = y;
this.z = z;
}
}
class volume {
public static void main(String args[]) {
Point3D p1 = new Point3D(1.1,1.1,1.1);
double answer1 = p1.x*p1.y*p1.z;
System.out.println("Volume1 = " + answer1);
Point3D p2 = new Point3D(2.2);
double answer2 = Math.pow(p2.x,3);
System.out.println("Volume2 = " + answer2);
Point3D p3 = new Point3D(Math.PI,3.3,3.3);
double answer3 = p3.x*Math.pow(p3.y,2)*p3.z;
System.out.println("Volume3 = " + answer3);
}
}
実行結果
Volume1 = 1.3310000000000004
Volume2 = 10.648000000000003
Volume3 = 112.89941519205637
(1)の考察
- まず、クラスPoint3D内にコンストラクタを用意する。
- コンストラクタでは、double型の引数を3つ受け取る。
- thisキーワードを使用してインスタンス変数を参照。
- volumeクラスでは、new演算子を使ってPoint3Dクラスのインスタンスを作成。
- オブジェクトへの参照はローカル変数p1,p2,p3に代入する。
- 体積を求める公式より、体積を計算する。求める体積は上から、直方体、立
方体、円柱。
- 最後にprintln()メソッドを使用してそれぞれの体積の値を表示する。
(2)2種以上の表面積を求めるクラスを作成し、同様に実行せよ。
(2)のソースプログラム
class Detail {
double p = Math.PI;
double r;
double h;
Detail(double r) {
this.r = r;
}
Detail(double r,double h) {
this.r = r;
this.h = h;
}
}
class Area {
public static void main(String args[]) {
Detail a = new Detail(2);
double answer1 = 4*a.p*Math.pow(a.r,2);
System.out.println("Area1 = " + answer1);
Detail b = new Detail(4,4);
double answer2 = 4*(0.5*b.r*b.h);
System.out.println("Area2 = " + answer2);
}
}
実行結果
Area1 = 50.26548245743669
Area2 = 32.0
(2)の考察
- まず、クラスDetail内にコンストラクタを用意する。
- コンストラクタでは、double型の引数を1つだけ受け取る。
- thisキーワードを使用してインスタンス変数を参照。
- Area2クラスでは、new演算子を使ってDetailクラスのインスタンスを作成。
- オブジェクトへの参照はローカル変数a,bに代入する。
- 表面積の公式より計算をするその際、パイはMathクラスを使う。
- 求める表面積は上から球の表面積、三角錐の表面積。
- 最後にprintln()メソッドを使用して表面積の値を表示する。
(3)例題を参考に、階乗計算を再帰プログラムにより作成し、for文による階乗計
算との違いを考察せよ。
(3)のソースプログラム
import java.io.*;
class Recursive {
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("再帰呼び出しによる階乗計算 => ");
System.out.println(num + "!=" + detail(num));
}
static int detail(int n) {
if(n == 0) return(1);
return detail(n-1)*n;
}
}
実行結果
input natural number: 5
再帰呼び出しによる階乗計算 => 5!=120
(3)とFOR文の階乗計算との違いの考察
- 先生の再帰呼び出しのサンプルのページを参考にした。
- detail(int n)メソッド内でfor文と同じ動きをするようした。
- もし、nが0なら1を返す。これは階乗のf(0)=1と同じ処理。
- detail(n-1)でn=1になった時から自分を読む再帰が始まる。
- 例えば、n=3の時、detail(n-1)にきた時にdetailブロックの最初に戻り処理
をする。要するに順番に2*3,1*3,0*3の処理をする。
- 再帰プログラムは階乗計算のfor文の処理をfor文を用いずにできる。
感想
- 今回の課題は(1)、(2)はすぐにできたけれど最後の再帰プログラムは友人に
助けてもらってできました。
- 今までの階乗計算のプログラムはfor文でしかやっていなかったので再帰プ
ラグラムを用いた階乗計算プログラムはすごいなと感じました。
- あと、課題をやっていて思ったことは、もうすぐクリスマスなのに自分は何
をやっているんだと思いました。