Programing2 Report3

Report3


課題:Report#3:体積・表面積公式クラスの作成{~12/11(Mon)}

(1)3種以上の体積を求めるクラスを作成し、具体的な値を入力しプログラムを実行せよ。
(2)2種以上の表面積を求めるクラスを作成し、同様に実行せよ。
(3)例題を参考に、階乗計算を再帰プログラムにより作成し、for文による 階乗計算との違いを考察せよ。

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

Taiseki.java

01:class Keisan {
02:    int rippou(int a, int b, int h) {
03:        return  a * b * h;
04:    }
05:    double entyu(int r, int h){
06:        return r * r * Math.PI * h;
07:    }
08:    double ensui(int r, int h){
09:        return r * r * Math.PI * h / 3;
10:    }
11:}
12:
13:class Taiseki {
14:    public static void main(String args[]){
15:        int x, y, z, ri;
16:           double ent,ens;
17:        Keisan enzan = new Keisan();
18:        x = 5;
19:        y = 5;
20:        z = 10;
21:        ri   = enzan.rippou(x, y, z);
22:        ent  = enzan.entyu(x, z);
23:        ens  = enzan.ensui(x, z);
24:        System.out.println("縦の長さ" + x);
25:        System.out.println("横の長さ" + y);
26:        System.out.println("高さ" + z);
27:        System.out.println("立方体の体積" + ri);
28:        System.out.println();
29:        System.out.println("半径" + x);
30:        System.out.println("高さ" + z);
31:        System.out.println("円柱の体積" + ent);
32:        System.out.println();
33:        System.out.println("半径" + x);
34:        System.out.println("高さ" + z);
35:        System.out.println("円錐の体積" + ens);
36:    }
37:}
       

実行結果

[nw0602:~/prog2] j06002% javac Taiseki.java
[nw0602:~/prog2] j06002% java Taiseki
縦の長さ5
横の長さ5
高さ10
立方体の体積250

半径5
高さ10
円柱の体積785.3981633974483

半径5
高さ10
円錐の体積261.79938779914943
       

考察

このプログラムでは、立方体、円柱、円錐の体積を求めている。
まず始めに、[Keisan]クラスを作成し、それぞれの体積を求めるように計算式
を入力する。
この計算式にある[Math.PI]とは、数学のπを表す。(π=3.1415926535……)
立方体の体積は底面積*高さなので縦をa、横をb、高さをhと置いて計算式を立
てた。よって体積=(a*b*h)となる。
円柱の体積も同じく底面積*高さなので、底面の半径をr、高さをhと置いて計
算式を立てた。よって体積=(r*r*Math.PI*h)となる。
円錐の体積は底面積*高さ/3なので、底面の半径をr、高さをhと置いて計算式
を立てる。よって体積=(r*r*Math.PI*h/3)となる。
次に、mainであるTaisekiクラスを作成する。
ここで、円柱&円錐はπを利用するため、浮動小数点を扱うのdoubleで変数を宣言した。
他の変数はint型で領域を確保する。
また、始めに作ったKeisanクラスを利用するためにオブジェクト変数をそれぞ
れ宣言する。
そして宣言した[ x, y, z ]にそれぞれ数字を代入。
その値をenzanで呼び出したKeisan内のメソッドにそれぞれ代入し、帰って来
た値をそれぞれ変数[ri][ent][ens]へ格納する。
24行から下はその結果を出力するという意味である。

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

Hyoumen.java

01:class Keisan{
02:     double ball(int r, int h){
03:         return 4 * Math.PI *r * r;
04:    }
05:    double entyu(int r, int h){
06:        return 2 * r * r * Math.PI + h * 2 * r * Math.PI;
07:    }
08:}
09:class Hyoumen{
10:    public static void main(String args[]){
11:        int  x, y;
12:        double  ba, en;           
13:        Keisan enzan = new Keisan();
14:        x = 5;
15:        y = 4;
16:        ba  = enzan.ball(x, y);
17:        en  = enzan.entyu(x, y);
18:        System.out.println("半径" + x);
19:        System.out.println("高さ" + y);
20:        System.out.println("球体の表面積" + ba);
21:        System.out.println();
22:        System.out.println("半径" + x);
23:        System.out.println("高さ" + y);
24:        System.out.println("円柱の表面積" + en);
25:    }
26:}
       

実行結果

[nw0602:~/prog2] j06002% javac Hyoumen.java
[nw0602:~/prog2] j06002% java Hyoumen
半径5
高さ4
球体の表面積314.1592653589793

半径5
高さ4
円柱の表面積282.7433388230814
       

考察

このプログラムは図形の表面積を計算するプログラムである。
まずKeisanクラスを作り、球と円柱の表面積を求めるよう返す式を書いた。
球の表面積=4πr^2より[ return 4*Math.PI*r*r]。
円柱の表面積=2*(底面の面積)+(円周*高さ)より
[2*(r*r*Math.PI)+(2*r*Math.PI*h)]。

mainのHyoumenクラスでは、まず変数x,yをint型で宣言。
次に小数点以下を表示するためにbaとenをdouble型で宣言する。
このクラスの中でKeisanクラスを利用するためにenzanオブジェクトで呼び出
す。
宣言したx,yに値を入力し、その値をそれぞれenzanで呼び出したKeisanの各メ
ソッドに入力し、返り値を[ba][en]に格納。
18行目以下は、その格納された値を出力している。

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

01:class factrial {
02:
03:    public static void main(String args[]) throws Exception {
04:
05:        BufferedReader in = new BufferedReader(new
06:        InputStreamReader(System.in)\);
07:
08:        System.out.print("input natural number: ");
09:        int num = (new Integer(in.readLine())).intValue();
10:
11:        System.out.print("for文を使った階乗計算      => ");
12:        System.out.println(num + "! =" + factfor(num));
13:
14:        System.out.print("再帰呼び出しによる階乗計算 => ");
15:        System.out.println(num + "! =" + factrec(num));
16:
17:    }
18:    /* for 文を使った階乗の計算 */
19:    static int factfor(int number) {
20:
21:        int factrial = 1;
22:
23:        for (int i = 1; i <= number; i++) {
24:            factrial = i * factrial;
25:        }
26:
27:        return(factrial);
28:
29:    }
30:
31:    /* 再帰による階乗の計算 */
32:    static int factrec(int number) {
33:
34:        if (number == 0) return(1);
35:        return( number*factrec(number-1) );
36:}
37:}

実行結果

[nw0602:~/prog2] j06002% javac factrial.java
[nw0602:~/prog2] j06002% java factrial
input natural number: 5
for文を使った階乗計算      => 5! =120
再帰呼び出しによる階乗計算 => 5! =120
       

考察

階乗計算のfor文と再帰に対する考察。
for文の階乗計算は、factrialをまず1と宣言し、変数iにも1を代入する。
次にfactrialに[i * facrial]を代入する。
この処理をiが入力された文字まで1ずつ加え、繰り返し処理をする。
今回の計算だとnumberに5が代入される。
つまりfactrial(1)=1*factrial(0)=1*1から始まり、factrial(2)=2*factrial(1)=2*1、
factrial(3)=3*factrial(2)=3*2*1、factrial(4)=4*factrial(3)=4*3*2*1、
factrial(5)=5*factrial(4)=5*4*3*2*1となり、結果はfactrial=5!となる。

これとは違い、再帰による階乗計算はfactrec(number-1)の値、今回の場合だ
とnumberが5なので5*factrec(4)=5*4*factrec(3)を使って計算することになる。
また、factrec(number)= number * factrec(number - 1)の公式と、
factrec(0)=1の定義より
factrec(5)=5*factrec(4)=5*4*factrec(3)=5*4*3*factrec(2)=
5*4*3*2*factrec(1)=5!*factrec(0)=5!
となり、結果的にはfactrec(5)=5!=120が演算結果となる。



感想&まとめ

今回は期間も長いし、楽っぽいなー。と考えてました。いつものことですが、 どこからその考えが浮かぶのか、期限間近でやっと終わった私には分かりませ ん。出来る事なら三週間前の自分を殴ってやりたい。 何が起こるか分からないってことを前提に行動しないとこんなことになるんだ なと反省しています。実際、プログラミングの課題の代わりとでも言うかのご とく、ソフトウェア基礎ではロボコードやLatex、工業数学は試験の一週間前 に試験告知などもあり、「あのときにやっておけば」という言葉をかみしめた レポートでした。結局手をつけ始めることが出来たのはいつもと同じく閉め切 り間近。この土曜日はネットワークのオンライン試験も受けなくてはならなかっ たため、休日の朝早くに来て、外が闇に覆われてから帰宅しました。 夜風が冷たかったです。先生も体にはお気をつけて。 あ、北谷のシーサイドボウルのところのラーメン屋は美味しかったです。ぜひ オススメします!

Back Top