report3

ProgrammingII report#3

TOP 情報工HP ProgrammingII
report#01
report#02
report#03
report#04
report#05
report#06
動作環境はsafariでやったので、safariを推奨します。

【Report#3】 体積・表面積公式クラスの作成
  • 制御文と配列を用いてオリジナルのJavaアプリケーションによる初級問題(なるべく短い行数で)を作成し、 模範解答例を示せ。併せて、同様な動作を行うC言語のソースコードを示せ。
  • 感想

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


    体積のソース(Taiseki.java)
    01:
    02:
    03:
    04:
    05:
    06:
    07:
    08:
    09:
    10:
    11:
    12:
    13:
    14:
    15:
    16:
    17:
    18:
    19:
    20:
    21:
    22:
    23:
    24:
    25:
    26:
    27:
    28:
    
    class Data{
      int rippotai(int x){
         return x * x * x;
      }
      int tyokuhotai(int x,int y,int z){
          return x * y * z;
      }
       int kyu(int x){
         return x * x * x * 314 / 100 * 4 / 3;
       }
    }
    public class Taiseki{
      public static void main(String args[]){
        int a, b, c, rip, tyo;
        float kyu;
        Data enzan = new Data();
        a = 5;
        b = 7;
        c = 10;
        rip = enzan.rippotai(a);
        tyo = enzan.tyokuhotai(a, b, c);
        kyu = enzan.kyu(a);
        System.out.println("一辺が" + a + "の立方体の体積は" + rip + "である。" );
        System.out.println("縦" + a + "横" + b + "高さ" + c + "の直方体の体積は" + tyo + "である。" );
        System.out.println("半径が" + a + "の球の体積は" + kyu + "である。");
        }
    }
    

    実行結果
    01:
    02:
    03:
    
    一辺が5の立方体の体積は125である。
    縦5横7高さ10の直方体の体積は350である。
    半径が5の球の体積は523である。
    

    解説:
    1行目〜11行目は立方体・直方体・球のそれぞれの体積を求めるクラスである。
    14行目〜16行目では変数を宣言して、17行目〜22行目まではそれぞれの変数に値を代入している。
    



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


    表面積ソース(Hyomenseki.java)
    01:
    02:
    03:
    04:
    05:
    06:
    07:
    08:
    09:
    10:
    11:
    12:
    13:
    14:
    15:
    16:
    17:
    18:
    19:
    20:
    21:
    22:
    
    class Data2{
        int rippotai(int x){
    	return x * x * 6;
        }
        int kyu(int x){
    	return x * x * 4 * 314 /100;
        }
    }
    
    public class Hyomenseki{
        public static void main(String args[]){
    	int a, rip;
    	float kyu;
    	Data2 enzan = new Data2();
    	a = 5;
    	rip = enzan.rippotai(a);
    	kyu = enzan.kyu(a);
    	System.out.println("一辺が" + a + "の立方体の表面積は" + rip + "である。");
    	System.out.println("半径が" + a + "の球の表面積は" + kyu + "である。");
        }
    }
    

    実行結果
    01:
    02:
    
    一辺が5の立方体の表面積は150である。
    半径が5の球の表面積は314.0である。
    

    解説:
    1行目〜8行目は立方体と球のそれぞれの表面積を求めるクラスである。
    12行目〜13行目では変数を宣言していて、15行目〜17行目でそれぞれの変数に値を代入している。
    



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


    階乗ソース(Kaijo.java)
    01:
    02:
    03:
    04:
    05:
    06:
    07:
    08:
    09:
    10:
    11:
    12:
    13:
    14:
    15:
    16:
    17:
    18:
    19:
    20:
    21:
    22:
    23:
    24:
    25:
    26:
    27:
    28:
    29:
    30:
    31:
    32:
    33:
    34:
    35:
    36:
    37:
    38:
    39:
    40:
    41:
    42:
    43:
    
    import java.io.*;
    
    public class Kaijo {
    
      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.print("再帰呼び出しによる階乗計算 => ");
        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);
        else 
          return factrec(number-1)*number;
    
      }
    
    }
    

    実行結果
    01:
    02:
    03:
    
    input natural number: 5
    for文を使った階乗計算      => 5! =120
    再帰呼び出しによる階乗計算 => 5! =120
    

    解説
    7行目と10行目ではBufferedReaderコンストラクタを使って文字列を読みとっている。BufferedReaderはReaderを拡張
    したクラスで、文字ストリームからの入力をバッファにいれる。このクラスは、Readerで定義されるメソッドをすべて実装す
    る。さらに、文字ストリームから改行終端文字を読み取るreadLine()メソッドを提供する。
    21行目〜31行目ではfor文を利用して階乗の計算をしている。
    一方、34行目〜40行目では再帰呼び出しを使って階乗の計算をおこなっている。これは再帰的に,つまり定義のなかで自分自身
    を参照するように,行うことも可能である。このような再帰関数(recursive function)は,繰り返しを伴うような計算を表
    現するために用いることができる。
    

    考察:
    再帰は処理の流れを追うのが非常に困難である。
    for文みたくループが一周するたびに制御変数の変動を考え、処理を理解する方法は通じないのである。
    何かの処理をくり返したいようなとき、for 文や while 文のようなくり返し構文を使うことが多いわけだが、そうした構文
    を使わずに再帰的な定義により計算することも可能である。実際、ある種の処理はくり返しを使うよりも再帰的に定義したほう
    が自然かつ簡潔に記述できることがある。for文では入力した自然数の数になるまで1から1ずつ増やしていってそれを毎回か
    けているが、再帰では38行目の計算が完結するために毎回自分を呼び出しnumberが0になるまでつづけている。再帰呼び出しは
    イメージで理解できやすいと思う。それぞれにはそれぞれのいいところがあると思う。



    感想


     今回のレポートはいつもよりスムーズにできたと思います。再帰呼び出しという新しいことを学んだけど、それ以前に基礎
    力がまだまだたりないなあと思う課題でもありました。これからはもっとむずかしくなると思うので、今のうちに基礎を固め
    ようと思います。