第10回 クラスの機能(2)

    
  
 演習
 
<演習1>
以下のソースはDNumbersクラスを定義して、99.910個表示するプログラムである。
プログラムを打ち込んで、コンパイル・実行しなさい。

ソースファイル名は Ensyu1001.java とする。
 
class DNumbers
{
  double [] val; // データ
  int num; // 要素数

  public DNumbers(){ // 99.9を10個代入する
    num = 10;
    val = new double [num];
    for(int i=0;i<num;i++) val[i] = 99.9;
  }

  public void showData(){
    for(int i=0;i<num;i++){
      System.out.printf("%5.1f",val[i]);
    }
    System.out.println();
  }
}

class Ensyu1001
{
  public static void main(String[] args)
  {
    DNumbers d1 = new DNumbers();

    d1.showData();
  }
}

  
<実行結果>
C:\java>java Ensyu1001
 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9

C:\java>
 
 
 
<演習2>
<演習1>のプログラムで、コンストラクタのオーバーロードを行う。
引数で渡された値 v10個作成・代入するコンストラクタ
  public DNumbers(double v){ ・・・・
を<演習1>の DNumbersクラスに追加して、以下のプログラムを動くようにしなさい。
青文字の箇所も追加しなさい。

ソースファイル名は Ensyu1002.java とする。
 
class DNumbers
{
  double [] val; // データ
  int num; // 要素数

  public DNumbers(double v){ // vを10個代入する(演習2)

    /* ここに追加 */

  }

  public DNumbers(){ // 99.9を10個代入する
    num = 10;
    val = new double [num];
    for(int i=0;i<num;i++) val[i] = 99.9;
  }

  public void showData(){
    for(int i=0;i<num;i++){
      System.out.printf("%5.1f",val[i]);
    }
    System.out.println();
  }
}

class Ensyu1002
{
  public static void main(String[] args)
  {
    DNumbers d1 = new DNumbers();
    DNumbers d2 = new DNumbers(35.6);

    d1.showData();
    d2.showData();
  }
}

    
<実行例>
C:\java>java Ensyu1002
 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9
 35.6 35.6 35.6 35.6 35.6 35.6 35.6 35.6 35.6 35.6


C:\java>
     
 
<演習3>
<演習2>のDNumbersクラスに以下のコンストラクタを追加する。
引数の値 vn 個作成・代入するコンストラクタ
  public DNumbers(double v, int n){ ・・・・
/* ここに追加 */ のところに記述しなさい。
また、青文字の部分は<演習2>から追加している。

ソースファイル名は Ensyu1003.java とする。
 
class DNumbers
{
  double [] val; // データ
  int num; // 要素数

  public DNumbers(double v, int n){
// vをn個代入する(演習3)

    /* ここに追加 */

  }

  public DNumbers(double v){ // vを10個代入する(演習2)
    /* <演習2で追加された部分> */
  }

  public DNumbers(){ // 99.9を10個代入する
    num = 10;
    val = new double [num];
    for(int i=0;i<num;i++) val[i] = 99.9;
  }

  public void showData(){
    for(int i=0;i<num;i++){
      System.out.printf("%5.1f",val[i]);
    }
    System.out.println();
  }
}

class Ensyu1003
{
  public static void main(String[] args)
  {
    DNumbers d1 = new DNumbers();
    DNumbers d2 = new DNumbers(35.6);
    DNumbers d3 = new DNumbers(72.1, 6);

    d1.showData();
    d2.showData();
    d3.showData();
  }
}

  
<実行例>
C:\java>java Ensyu1003
 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9
 35.6 35.6 35.6 35.6 35.6 35.6 35.6 35.6 35.6 35.6
 72.1 72.1 72.1 72.1 72.1 72.1

C:\java>
  
  
   
<演習4>
<演習3>までで作成した3個のコンストラクタは、他のコンストラクタを呼び出すことで記述を簡潔にできる。
下記のプログラムで /* this(???)を利用した記述に変更する */ のところを<演習3>から修正しなさい。

ソースファイル名は Ensyu1004.java とする。
 
class DNumbers
{
  double [] val; // データ
  int num; // 要素数

  public DNumbers(double v, int n){
// vをn個代入する(演習3)
    /* <演習3で追加された部分> */
  }

  public DNumbers(double v){ // vを10個代入する(演習2)
    /* this(???)を利用した記述に変更する */
  }

  public DNumbers(){ // 99.9を10個代入する
    /* this(???)を利用した記述に変更する */
  }

  public void showData(){
    for(int i=0;i<num;i++){
      System.out.printf("%5.1f",val[i]);
    }
    System.out.println();
  }
}

class Ensyu1004
{
  public static void main(String[] args)
  {
    DNumbers d1 = new DNumbers();
    DNumbers d2 = new DNumbers(35.6);
   
DNumbers d3 = new DNumbers(72.1, 6);

    d1.showData();
    d2.showData();
   
d3.showData();
  }
}

  
<実行例>
C:\java>java Ensyu1004
 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9 99.9
 35.6 35.6 35.6 35.6 35.6 35.6 35.6 35.6 35.6 35.6
 72.1 72.1 72.1 72.1 72.1 72.1

C:\java>
  
  
 
<演習5>
以下のプログラムで DNumber2クラス のコンストラクタで任意の配列を設定できるようにする。
コンストラクタの引数で渡された配列から、配列の要素数を自動的に決定する。
/* (※1) *//* (※2) */ に適切な内容を埋めてプログラムが動くようにしなさい。

ソースファイル名は Ensyu1005.java とする。
  
class DNumbers2
{
  double [] val; // データ
  int num; // 要素数

 
// 配列を引数で受け取るコンストラクタ
  public DNumbers2(double [] v){
    num = /* (※1) */  // 配列vの要素数を代入
    val =
/* (※2) */  // 要素領域の確保
    for(int i=0;i<num;i++) val[i] = v[i];
  }

  public void showData(){
    for(int i=0;i<num;i++){
      System.out.printf("%5.1f",val[i]);
    }
    System.out.println();
  }
}

class Ensyu1005
{
  public static void main(String[] args)
  {
    double [] data = {10.0, 20.8, 30.3, 40.5};
    DNumbers2 d = new DNumbers2(data);

    d.showData();
  }
}

   
<実行例>
C:\java>java Ensyu1005
 10.0 20.8 30.3 40.5

C:\java>
  

 
<演習6>
以下のソースは、Sportsクラスを定義して、チームの人数試合時間を処理するプログラムである。
メンバ変数は
  int person; // チームの人数(人)
  double time; // 試合時間(分)
  static int p_sum; // 全てのインスタンスのチーム合計人数
であり、 p_sum はクラス変数である。

コンストラクタは3個であり、
  public Sports(int p, double t){ // 人数、時間を指定
  public Sports(int p){ // 人数のみ指定
  public Sports(){ // 指定なし
のようにオーバーロードする。コンストラクタでは
 チーム人数の指定がない場合は 1人
 試合時間の指定がない場合は 0.0分
をデフォルト値として設定する。

また、オブジェクト(インスタンス)を作成するごとに、チーム人数をクラス変数 p_sum に加算していくものとする。
下記の実行例は、サッカー、ラグビー、野球、テニスのオブジェクト(インスタンス)を作成し、実行した例である。

/* (※1) *//* (※4) */ に適切な内容を埋めてプログラムが動くようにしなさい。

ソースファイル名は Ensyu1006.java とする。
   
class Sports
{
  int person;  // チームの人数(人)
  double time; // 試合時間(分)
  static int p_sum = 0; // 全てのインスタンスのチーム合計人数

  public Sports(int p, double t){ // 人数、時間を指定
    person = p;
    time = t;
    /* (※1) */ // クラス変数に加算
  }

  public Sports(int p){ // 人数のみ指定
   
/* (※2) */  // 他のコンストラクタを呼び出す
  }

  public Sports(){ // 指定なし
   
/* (※3) */   // 他のコンストラクタを呼び出す
  }

  public void showData(){
    System.out.println(" 人数 = "+ person + ", 時間 = " + time );
  }

  static public void showGoukei(){ // クラスメソッド
    System.out.println(" 合計人数 = " + p_sum );
  }
}

class Ensyu1006
{
  public static void main(String[] args)
  {
    Sports soccor = new Sports( 11, 90.0 ); // サッカー
    Sports rugby = new Sports( 15, 80.0 ); // ラグビー
    Sports baseball = new Sports( 9 ); // 野球
    Sports tennis = new Sports(); // テニス

    soccor.showData();
    rugby.showData();
    baseball.showData();
    tennis.showData();

   
/* (※4) */ // すべての合計人数を表示
  }
}

  
<実行結果>
C:\java>java Ensyu1006
 人数 = 11, 時間 = 90.0
 人数 = 15, 時間 = 80.0
 人数 = 9, 時間 = 0.0
 人数 = 1, 時間 = 0.0
 合計人数 = 36

C:\java>
  
  
演習問題の提出について
演習1演習6のプログラムソースの内容をTextファイルに記述して、Cerezo から提出しなさい。
上記の内容をすべて1個のTextファイルにまとめ、ファイル名は

   [自分の学籍番号]+"_演習10.txt"  
  (例:"5412016_演習10.txt"、"5412003_演習10.txt" など


のように保存してから提出すること。
提出物には学籍番号と氏名を必ず記載しておくこと。
 
 
<提出ファイルの作成例>
第10回演習問題の回答  5412099 福山太郎

- 演習1 -----------------------------------------
class Ensyu1001
{
  public static void main(String[] args) 
  {
      : 
  }
}

- 演習2 -----------------------------------------
class Ensyu1002
{
  public static void main(String[] args) 
  {
      : 
      :