report#3

課題

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


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


taiseki.javaのソース

01.class keisan {
02. double pai = 3.14;
03. int tyokuhoutai(int a, int b, int c) {
04. return a * b * c;
05. }
06. double entyu(int a, int b){
07. return a * a * pai * c;
08. }
09. double sikakusui(int a, int b, int c){
10. return a * b * c / 3;
11. }
12.}
13.class taiseki {
14. public static void main(String args[]){
15. int a,b,c,tyoku,shikaku;
16. double en;
17. Keisan enzan = new Keisan();
18. a = 3;
19. b = 5;
20. c = 7;
21. tyoku = enzan.tyokuhou(a, b, c);
22. en = enzan.entyu(a, c);
23. shikaku = enzan.shikakusui(a, b, c);
24. System.out.println("");
25. System.out.println("縦の長さ" + a);
26. System.out.println("横の長さ" + b);
27. System.out.println("高さ" + c);
28. System.out.println("直方体の体積" + tyoku);
29. System.out.println("");
30. System.out.println("円の半径" + a);
31. System.out.println("高さ" + c);
32. System.out.println("円柱の体積" + en);
33. System.out.println("");
34. System.out.println("縦の長さ" + a);
35. System.out.println("横の長さ" + b);
36. System.out.println("高さ" + c);
37. System.out.println("四角錐の体積" + shikaku);
38. System.out.println("");
39. }
40.}

taiseki.javaの実行結果


縦の長さ3
横の長さ5
高さ7
直方体の体積105

円の半径3
高さ7
円柱の体積197.82

縦の長さ3
横の長さ5
高さ7
四角錐の体積35

taiseki.javaの考察

  • このプログラムでは、直方体、円柱、四角錐の体積を求めている。
  • 1行目では、keisanクラスを作成し、それぞれの体積を求めるように計算式 を入力している。
  • 2行目では、double型でpaiに3.14をセットした。
  • 直方体の体積は底面積*高さなので縦をa、横をb、高さをcと置いて計算式を立 てた。よって体積=(a*b*c)となる。
  • 円柱の体積も底面積*高さなので、底面の半径をa、高さをcと置いて計 算式を立てた。よって体積=(a*a*pai*c)となる。
  • 四角錐の体積は底面積*高さ/3なので、縦をa、横をb、高さをcと置いて計算式 を立てた。よって体積=(a*b*c/3)となる。
  • 13行目では、taisekiクラスを作成する。
  • 16行目では、円柱はπを利用するため、浮動小数点を扱うdoubleで変数を宣言した。
  • 17行目では、始めに作ったkeisanクラスを利用するためにオブジェクト変数をそれぞ れ宣言する。
  • 18、19、20行目では、宣言したx、y、zにそれぞれ3、5、7を代入する。
  • 21、22、23行目では、その値をenzanで呼び出したkeisan内のメソッドにそれぞれ代入し、帰って来た値をそれぞれ変数tyoku、en、shikakuへ格納する。
  • 24行からは、その結果を出力している。

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


    hyoumennseki.javaのソース

    1.class keisan{
    2. double pai = 3.14;
    3. int tyokuhoutai(int a,int b){
    4. return a*b*4;
    5. }
    6. double entyu(int a,int b){
    7. return 2 * a * a * pai + b * 2 * a * pai;
    8. }
    9.}
    10.class hyoumennseki {
    11. public static void main(String args[]) {
    12. int a,b,tyokuhou;
    13. double en;
    14. keisan enzan = new keisan();
    15. a = 3;
    16. b = 5;
    17. tyokuhou = enzan.tyokuhoutai(a,b);
    18. en = enzan.entyu(a,b);
    19. System.out.println("");
    20. System.out.println("縦の長さ "+a);
    21. System.out.println("横の長さ "+b);
    22. System.out.println("直方体の表面積   "+tyokuhou);
    23. System.out.println("");
    24. System.out.println("円の半径 "+a);
    25. System.out.println("高さ "+b);
    26. System.out.println("円柱の表面積  "+en);
    27. System.out.println("");
    28. }
    29.}

    hyoumennseki.javaの実行結果



    縦の長さ 3
    横の長さ 5
    直方体の表面積 60

    半径 3
    高さ 5
    円柱の表面積 150.72


    hyoumennseki.javaの考察

  • このプログラムでは、直方体、円柱の表面積を求めている。
  • 1行目では、keisanクラスを作成し、それぞれの表面積を求めるように計算式を入力している。
  • 2行目では、double型でpaiに3.14をセットした。
  • 直方体の表面積は底面積*4なので縦をa、横をbと置いて計算式を立てた。よって表面積=(a*b*4)となる。
  • 円柱の表面積は=2*(底面積)+(円周*高さ)なので円の半径をa,高さをbと置いて計算式を立てた。よって表面積={2*(a*a*pai)+(b*2*a*pai)}となる。
  • 10行目では、hyoumennsekiクラスを作成する。
  • 13行目では、円柱はπを利用するため、浮動小数点を扱うdoubleで変数を宣言した。
  • 14行目では、始めに作ったkeisanクラスを利用するためにオブジェクト変数をそれぞれ宣言する。
  • 15、16行目では、宣言したa、bにそれぞれ3、5を代入する。
  • 17、18行目では、その値をenzanで呼び出したkeisan内のメソッドにそれぞれ代入し、帰って来た値をそれぞれ変数tyokuhou、enへ格納する。
  • 19行目からは、その結果を出力している。

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


    factrial.javaのソース

    01:class factrial {
    02: public static void main(String args[]) throws Exception {
    03: BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    04: System.out.print("input natural number: ");
    05: int num = (new Integer(in.readLine())).intValue();
    06: System.out.print("for文を使った階乗計算 => ");
    07: System.out.println(num + "! =" + factfor(num));
    08: System.out.print("再帰呼び出しによる階乗計算 => ");
    09: System.out.println(num + "! =" + factrec(num));
    10: }

    /* for 文を使った階乗の計算 */
    11: static int factfor(int number) {
    12: int factrial = 1;
    13: for (int i = 1; i <= number; i++) {
    14: factrial = i * factrial;
    15: }
    16: return(factrial);
    17: }

    /* 再帰による階乗の計算 */
    18: static int factrec(int number) {
    19: if (number == 0) return(1);
    20: return( number*factrec(number-1) );
    21: }
    22: }

    factrial.javaの実行結果


    input natural number: 7
    for文を使った階乗計算 => 7! =5040
    再帰呼び出しによる階乗計算 => 7! =5040

    factrial.javaの考察

  • for文の階乗計算は、factrialをまず1と宣言し、変数iにも1を代入している。
  • 24行目では、factrialに[i * facrial]を代入している。
  • この処理はiが入力された文字まで1ずつ加え、繰り返し処理をしている。
  • 今回の計算だとnumberに7が代入されているので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(6)=6*factrial(5)=6*5*4*3*2*1、factrial(7)=7*factrial(6)=6*5*4*3*2*1となり、結果はfactrial=7!となる。
  • 再帰による階乗計算はfactrec(number-1)の値、今回の場合だとnumberが7なので7*factrec(6)=7*6*factrec(5)を使って計算することになる。
  • factrec(number)= number * factrec(number - 1)の公式と、factrec(0)=1の定義よりfactrec(7)=7*factrec(6)=7*6*factrec(5)=7*6*5*factrec(4)=7*6*5*4*factrec(3)=7*6*5*4*3*factrec(2)=7*6*5*4*3*2*factrec(1)=7!*factrec(0)=7!となり、結果的にはfactrec(7)=7!=5040が演算結果となる。

    反省と感想


  • 今回は長い期間、提出期限があったけど私にとってはぜんぜん長く感じなかった。