☆課題3☆
体積・表面積公式クラスの作成
* (1)3種以上の体積を求めるクラスを作成し、具体的な値を入力しプログラムを実行せよ。
* (2)2種以上の表面積を求めるクラスを作成し、同様に実行せよ。
* (3)例題を参考に、階乗計算を再帰プログラムにより作成し、for文による階乗計算との違いを考察せよ。
|
課題1 3種以上の体積を求めるクラスを作成し、具体的な値を入力しプログラムを実行せよ。
Taiseki.java
class Calculation {
void Cal(double r) {
System.out.println("球の体積 = " + r*r*r*Math.PI*4/3);
}
void Cal(double r, double h) {
System.out.println("三角錐の体積 = " + Math.PI*r*r*h/3);
}
void Cal(double x, double y, double h) {
System.out.println("四角柱の体積 = " + x*y*h);
}
}
class Taiseki {
public static void main(String args[]) {
Calculation obj = new Calculation();
obj.Cal(1);
obj.Cal(1,2);
obj.Cal(1,2,3);
}
}
|
実行結果
球の体積 = 4.1887902047863905
三角錐の体積 = 2.0943951023931953
四角柱の体積 = 6.0
|
課題2 2種以上の表面積を求めるクラスを作成し、具体的な値を入力しプログラムを実行せよ。
Hyomen.java
class Calculation {
void Cal(double r) {
System.out.println("球の表面積 = " + r*r*Math.PI*4);
}
void Cal(double x, double y, double h) {
System.out.println("四角柱の表面積 = " + (2*x*y+2*x*h+2*y*h));
}
}
class Hyomen {
public static void main(String args[]) {
Calculation obj = new Calculation();
obj.Cal(1);
obj.Cal(1,2,3);
}
}
|
実行結果
球の表面積 = 12.566370614359172
四角柱の表面積 = 22.0
|
〜体積・表面積プログラムの考察〜
「Taiseki.java」「Hyomen.java」の Calculationクラスには"Cal()メソッド"が複数存在している。
このように、同じ名前の複数のメソッドを、同じクラス内に定義する事を『オーバーロード』という。
メソッドをオーバーロードするときは、各メソッドの引数の型・個数が異なるようにする。
Taiseki.javaの場合
void Cal(double r)
void Cal(double r, double h)
void Cal(double x, double y, double h)
|
と引数の型は同じであるが、個数が異なるのでオーバーロードできる。
Hyomen.javaの場合
void Cal(double r)
void Cal(double x, double y, double h)
|
と引数の型は同じであるが、個数が異なるのでこっちもオーバーロードできる。
「体積の公式」について
- 球の体積の公式は「4/3×π×半径×半径×半径」なので『r*r*r*Math.PI*4/3』と記述する。
- 三角錐の体積の公式は「1/3×π×半径×半径」なので『Math.PI*r*r/3』と記述する。
- 四角柱の体積の公式は「底面積×高さ」なので『r*r*r*Math.PI*4/3』と記述する。
「表面積の公式」について
- 球の表面積の公式は「4×π×半径×半径」なので『r*r*Math.PI*4』と記述する。
- 四角柱の表面積の公式は側面積の和のなので『2*x*y+2*x*h+2*y*h』と記述する。
「obj.Cal()」について
- obj.Cal()にいれた個数が等しいところへ飛んで値を代入している。
具体例:「Taiseki.java」では『obj.Cal(1,2);』と2つの数値を入力すれば
void Cal(double r, double h) {
System.out.println("三角錐の体積 = " + Math.PI*r*r*h/3);
}
の処理を行う。rには1hには2が格納される。
階乗プログラム Factrial.java
import java.io.*;
class Factrial{
public static void main(String args[]) throws Exception{
BufferedReader in = new BufferedReader(new
InputStreamReader(Syste\m.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.println("再帰呼び出しによる階乗計算 => " + num + "! =" + factrec(num)\);
}
/* for文を使った階乗計算 */
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));
}
}
|
実行結果
input natural number: 5
for文を使った階乗計算 => 5! =120
再帰呼び出しによる階乗計算 => 5! =120
|
〜階乗プログラムの考察〜
・for文のによる階乗計算はfactrec,iの初期値を1とし、factrecとiとをかけ、factrecに代入している
事が分かる。あとはiをインクリメントによる階乗計算をしている事となる。
・再帰呼び出しによる階乗計算(今回は5の階乗)5 * factrec(4)となる。factrec(4)が分からないので
再びfactrecを呼び出し、factrec(4)を計算する。
また、factrial(4) = 4 * factrec(3)となって同じように再びfactrecを呼び出す。
これを繰り返し、0の階乗の時1を返すより、factrec(1)〜(5),の値が分かったので階乗計算を行える。
〜感想〜
一番シンプルなプログラムで書いてみた。
今回はオーバロードしか使っていないが次からは継承やオーバーライドなど
を含むプログラムを作れればいいなと思った。
|