☆課題☆

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

(1)のプログラム

  1. class out{
  2. double DICE (double l) { //さいころ
  3. double S;
  4. S = l*l;
  5. return (S*l);
  6. }
  7. double TOTE (double r, double h) { //円柱
  8. double S;
  9. S = r*r*Math.PI;
  10. return (S*h);
  11. }
  12. double SOFT (double r, double h) { //円錐
  13. double S;
  14. S = r*r*Math.PI;
  15. return (S*h/3);
  16. }
  17. }
  18. public class rep_3 {
  19. public static void main(String args[]){
  20. double l, r, h, DICE, TOTE, SOFT;
  21. out C = new out();
  22. l = 20;
  23. h = 30;
  24. r = 10;
  25. DICE = C.DICE(l);
  26. TOTE = C.TOTE(r, h);
  27. SOFT = C.SOFT(r, h);
  28. System.out.println("length =" + l );
  29. System.out.println("Volume of DICE =" + DICE);
  30. System.out.println("length =" + r );
  31. System.out.println("height =" + h );
  32. System.out.println("Volume of TOTEM POLE =" + TOTE);
  33. System.out.println("Radius =" + r );
  34. System.out.println("height =" + h );
  35. System.out.println("Volume of SOFTCREEM =" + SOFT);
  36. }
  37. }

実行結果

length =20.0 Volume of DICE =8000.0 length =10.0 height =30.0 Volume of TOTEM POLE =9424.77796076938 Radius =10.0 height =30.0 Volume of SOFTCREEM =3141.592653589793

(1)のプログラムの解説

1.〜6.まで

さいころとかいってただの立方体の体積だったりする。
一辺の長さlを3回かけただけ。

7.〜11.まで

トーテムポールなのでTOTE。やっぱりただの円柱。
まず底面積を求めようと半径かける半径かける円周率(Math.PI)。
それから高さをかけて体積のできあがり。

12.〜16.まで

ソフトクリームみたいなのでSOFT。完全にこじつけ。円錐ってなんかあるかな。
円錐の体積は円柱の3分の1だったりする。

22.

上のクラスoutを下のメインクラス内に呼び出している。

23.〜25.

実際に値を入力。

26.〜28.

クラスoutの中のDICEの値をDICEに入れている。他も同様。

29.〜36.

出力部分。値の他にその計算に使った値も書き出してある。

(2)のプログラム

  1. class out {
  2. public static double TOTE(double r, double h) { //円柱
  3. double S, SS;
  4. S = r*r*Math.PI;
  5. SS = 2*r*Math.PI*h;
  6. return(S*2+SS);
  7. }
  8. public static double SOFT(double r, double h) { //円錐
  9. double S, l, SS;
  10. S = r*r*Math.PI;
  11. l = Math.hypot(r, h);
  12. SS = l*r*Math.PI;
  13. return(S+SS);
  14. }
  15. }
  16. public class rep__3 {
  17. public static void main(String args[]) {
  18. double l, r, h, TOTE, SOFT;
  19. out C = new out();
  20. l = 20;
  21. h = 30;
  22. r = 10;
  23. TOTE = C.TOTE(r, h);
  24. SOFT = C.SOFT(r, h);
  25. System.out.println("length =" + r );
  26. System.out.println("height =" + h );
  27. System.out.println("surface =" + TOTE);
  28. System.out.println("radius =" + r );
  29. System.out.println("height =" + h );
  30. System.out.println("surface =" + SOFT);
  31. }
  32. }

実行結果

length =10.0 height =30.0 surface =2513.2741228718346 radius =10.0 height =30.0 surface =1307.6180919385893

(2)のプログラムの解説

2.〜7.まで

円柱の表面積を求めるプログラム。 Sは底面積。半径かける半径かける円周率(Math.PI)。 SSは側面積。直径かける円周率かける高さ。 底面は二つあるので2倍している。

8.〜14.まで

円錐の表面積を求めるプログラム。 Sは底面積。それは上のと同じように求める。 SSは側面積。求めるには母線かける半径かける円周率。 母線の求め方はMath.hypot(r,h)これでrの2乗+hの2乗の平方根がとれる=母線。 底面積と側面積を合わせたら表面積のできあがり。

17.〜32.まで

体積を求めるプログラムと同じ流れなので省略。

(3)のプログラム

  1. import java.io.*;
  2. class saiki {
  3. public static void main(String args[]) throws Exception {
  4. BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  5. int num = (new Integer(in.readLine())).intValue();
  6. System.out.println("for文での階乗  => ");
  7. System.out.println(num + "! =" + factfor(num));
  8. System.out.println("再帰呼び出しでの階乗 => ");
  9. System.out.println(num + "! =" + factrec(num));
  10. }
  11. static int factfor(int number) { //for文を使った階乗プログラム
  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. }

実行結果

4 for文での階乗 => 4! =24 再帰呼び出しでの階乗 => 4! =24

(3)のプログラムの解説(どうなっているかの考察)

1.

標準入出力。java.ioに含まれるパッケージを全て使えるようにする。

8.〜11.

numに入力した文字が入る。そしてfactforの関数にnumの数字を渡す。factrecに同じようにする。

14.〜19.

iは1からはじめて入力した数字よりも小さかったら1増やすfor文。
4を入力した場合2かける3かける4になる。(階乗)

22.〜24.

number*factrec(number-1)に入力した文字がはいり、 return(4*factrec(3)); ↓ return(3*factrec(2)); ↓ return(2*factrec(1)); ↓ return(1*factrec(0)); ↓ return(1);で1になるので 1×1。 後は今までの値が順々に掛けられていき階乗計算となる。

感想

いつも始めるのが少し遅い。
今回はちょっと遅すぎて他の中間テストとかぶり、近頃はほとんど寝ていない。
まあプログラムよりもテストの影響の方が大きいが。中間テストの期間中はプログラミングの課題は無くして欲しい…o(;△;)o