class Volume{ int Ensui (int r,int h) { int A = (int) (Math.PI * r * r * h / 3); return(A); } int Enchuu (int r,int h) { int B = (int) (Math.PI * r * r * h); return(B); } int Kyuu (int r,int h) { int C = (int) (4 * Math.PI * r * r * r / 3); return(C); } } class Rep3_1 { public static void main(String args[]) { int r = 3; int h = 10; Volume V = new Volume(); int a = V.Ensui(r,h); int b = V.Enchuu(r,h); int c = V.Kyuu(r,h); System.out.println("Radius = " + r); System.out.println("Height = " + h); System.out.println("Cone = about " + a ); System.out.println("Column = about " + b ); System.out.println("Ball = about " + c ); } } |
Radius = 3 Height = 10 Cone = about 94 Column = about 282 Ball = about 113 |
このプログラムでは、円錐、円柱、球の体積を求めます。 ln.1(〜14) class Volume{ Volumeと言う独自のクラスを作った。 まず、ln.2〜14のようにEnsui、Enchuu、Kyuuというint型を作り、 中にはそれぞれ、公式を入れた。 円錐の体積の公式 πrrh / 3(底円の半径 r, 高さ h ) πはそのままでは使えないのでMathクラスのPI(π)を呼び出し、それを使います。 すると、Math.PI * r * r * h / 3となるが、 π=3.1415926535……と、πをかけると浮動小数点が出てくるので 結果を(int)で囲み、int型にします。 最後に、int型のAに結果を入れ、 Volume.Ensuiを呼び出す時にAの値を返すように return(A);と、returnを使う。 以下、同様に円柱、球の公式を指定した。 円柱の体積の公式は、πrrh(底円の半径 r, 高さ h )なので、 Math.PI * r * r * h) となる。 球の体積の公式は、4πrrr/ 3(球の半径 r )なので、 4 * Math.PI * r * r * r / 3 となる。 ln.17〜18 int r = 3; int h = 10; int型のr、hにそれぞれ3、10を入れる。 rは半径、hは高さを示す。 ln.19〜22 Volume V = new Volume(); int a = V.Ensui(r,h); int b = V.Enchuu(r,h); int c = V.Kyuu(r,h); それぞれEnsui、Enchuu、Kyuuを Volumeクラスから呼び出し、int型のa、b、cに入れる。 ln.23〜27 System.out.println("Radius = " + r); System.out.println("Height = " + h); System.out.println("Cone = about " + a ); System.out.println("Column = about " + b ); System.out.println("Ball = about " + c ); 半径、高さ、円錐の体積、円柱の体積、 球の体積を出力。
class Volume{ int Ensui (int r,int h) { int A = (int) (Math.PI*r*r+Math.PI*r*h); return(A); } int Enchuu (int r,int h) { int B = (int) (Math.PI*r*r*2+2*Math.PI*r*h); return(B); } int Kyuu (int r,int h) { int C = (int) (4 * Math.PI * r * r); return(C); } } class Rep3_2 { public static void main(String args[]) { int r = 3; int h = 10; Volume V = new Volume(); int a = V.Ensui(r,h); int b = V.Enchuu(r,h); int c = V.Kyuu(r,h); System.out.println("Radius = " + r); System.out.println("Height = " + h); System.out.println("Cone Surface area = about " + a ); System.out.println("Column Surface area = about " + b ); System.out.println("Ball Surface area = about " + c ); } } |
Radius = 3 Height = 10 Cone Surface area = about 122 Column Surface area = about 245 Ball Surface area = about 113 |
このプログラムは1のプログラムを元に、 円錐、円柱、球の表面積を求めるプログラム。 円錐の表面積の公式は、πrr +πrh (r = 底面の半径、h = 母線の長さ)なので、 Math.PI*r*r+Math.PI*r*hとなる。 円柱の表面積の公式は、2πrr +2πrh (r = 底面の半径、h = 高さ)なので、 Math.PI * r * r * h) となる。 球の表面積の公式は、4πrr(r = 半径)なので、 4 * Math.PI * r * r となる。 そのあとに、半径、高さ、円錐の表面積、円柱の表面積、球の表面積を出力。
import java.io.*; class Rep3_3 { 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("for => "); System.out.println(num + "! =" +factfor(num)); System.out.println("saiki => " + num + "! =" + factrec(num)); } 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 saiki => 5! =120 |
for文で求めた階乗計算と再帰で求めた階乗計算を比べてみる。 for文で求めた階乗計算 static int factfor(int number) { int factrial = 1; for (int i = 1; i <= number; i++) { factrial = i * factrial; } return(factrial); } 仕組みは、簡単で、 iがnumberになるまでiとfactrialをかける行為を繰り返す。 一度繰り返す度にiに1を足して行く。 例えば、number=5のとき、 i=1で1*1=1 i=2で1*2=2 i=3で2*3=6 i=4で6*4=24 i=5で24*5=120 結果、factrialには120が入り、factrialを返す。 再帰で求めた階乗計算 static int factrec(int number) { if (number == 0) return(1); return(number*factrec(number - 1)); } for文では1から順序良くかけたが、再帰ではnumberから逆にかける。 しかし、すぐには値が分からないので少しずつ戻り、 number=0まで呼び出して値を入れる。 例えば、number=5のとき、 5*factrec(4) factrec(4)が分からないのでfactrec(4)を呼び出す。 4*factrec(3) factrec(3)が分からないのでfactrec(3)を呼び出す。 3*factrec(2) factrec(2)が分からないのでfactrec(2)を呼び出す。 2*factrec(1) factrec(1)が分からないのでfactrec(1)を呼び出す。 1*factrec(0) factrec(0)=1なので、ようやく、解くことができる。 factrec(0)=1 factrec(1)=1*1=1 factrec(2)=2*1=2 factrec(3)=3*2=6 factrec(4)=4*6=24 factrec(5)=5*24=120 よってfactrecには120が入り、factrialを返す。 自分はとりあえず、for文の方が分かりやすくて好き。 +for文の方が処理が少なさそう。 しかし、文として書く場合は、再帰の方が短い。
再帰はあんまり好きじゃなかったです。 今回は特に目新しい用語がなく、説明がいつもより短く済みました。 3週間もあって長かったけど、ぎりぎりまでやらなかったのと テストが重なったので時間がかかったような気分になりました。