第9回 クラスの機能(1)

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

ソースファイル名は Ensyu0901.java とする。
 
import java.util.Scanner;

class Bunsuu // 分数を扱うクラス
{
  int bunshi; // 分子
  int bunbo; // 分母

  double getVal(){ // 分数を数値で返す
    return (double)bunshi/bunbo;
  }
}

class Ensyu0901
{
  public static void main(String[] args)
  {
    int a,b;
    Bunsuu v = new Bunsuu();
    Scanner sc = new Scanner(System.in);

    System.out.print("分子-->");
    a = sc.nextInt();
    System.out.print("分母-->");
    b = sc.nextInt();

    v.bunshi = a;
    v.bunbo = b;
    System.out.println(a+"/"+b+" = "+v.getVal());
  }
}

  
<実行結果>
C:\java>java Ensyu0901
分子-->1
分母-->8
1/8 = 0.125

C:\java>
 
 
 
<演習2>
<演習1>のプログラムで、分母に0(ゼロ)を入力すると数値が計算できない(無限大になる)。
C:\java>java Ensyu0902
分子-->2
分母-->0
2/0 = Infinity   <---無限大の表示

C:\java>

分母に0(ゼロ)が入力されると【警告】が表示されるように、プログラムを修正する。
以下のソースは<演習1>のソースを
 (1) Bunsuuクラスのメンバ変数をprivateにする
 (2) 変数に値を設定するメソッド(セッター)を追加する
 (3) 分母に0を設定すると、警告を表示する
の修正を行うものとする。

以下のソースで、/* ここを<演習1>から修正、さらにメソッドを追加 */ のところを記述しなさい。

ソースファイル名は Ensyu0902.java とする。
 
import java.util.Scanner;

class Bunsuu // 分数を扱うクラス
{

  /* ここを<演習1>から修正、さらにメソッドを追加 */

  public double getVal(){ // 分数を数値で返す
    return (double)bunshi/bunbo;
  }
}

class Ensyu0902
{
  public static void main(String[] args)
  {
    int a,b;
    Bunsuu v = new Bunsuu();
    Scanner sc = new Scanner(System.in);

    System.out.print("分子-->");
    a = sc.nextInt();
    System.out.print("分母-->");
    b = sc.nextInt();

    //v.bunshi = a;
    //v.bunbo = b;
    v.setBunshi(a);
    v.setBunbo(b);
    System.out.println(a+"/"+b+" = "+v.getVal());
  }
}

  
<実行例>
C:\java>java Ensyu0902
分子-->1
分母-->2
1/2 = 0.5

C:\java>java Ensyu0902
分子-->2
分母-->0
【警告】分母は0を設定できません
   <--- 分母が 0 の場合、警告を表示する
2/0 = Infinity

C:\java>
     
 
<演習3>
<演習2>のBunsuuクラスに以下の3個のメソッドを /* <演習2>からさらにメソッドを追加 */ のところにオーバーロードして追加する。
特に数値を指定しない場合は 分子=1、分母=10 を設定するものとする。
  setNum(); // 分子=1、分母=10
  setNum(int s); // 分子=s、分母=10
  setNum(int s, int t); // 分子=s、分母=t
なお、メソッドの型やアクセス修飾子は適切なものをつけること。
また、青文字の部分は<演習2>から修正している。

ソースファイル名は Ensyu0903.java とする。
 
import java.util.Scanner;

class Bunsuu // 分数を扱うクラス
{
  /* <演習2で追加された部分> */

 
/* <演習2>からさらにメソッドを追加 */

  public double getVal(){ // 分数を数値で返す
    return (double)bunshi/bunbo;
  }
}

class Ensyu0903
{
  public static void main(String[] args)
  {
    int a,b;
    Bunsuu v = new Bunsuu();
    Scanner sc = new Scanner(System.in);

    System.out.print("分子-->");
    a = sc.nextInt();
    System.out.print("分母-->");
    b = sc.nextInt();

    v.setNum(); // 指定なし
    System.out.println(" (1) "+v.getVal());
    v.setNum(a); // 分子のみ指定
    System.out.println(" (2) "+v.getVal());
    v.setNum(a,b); // 分子、分母を指定
    System.out.println(" (3) "+v.getVal());
  }
}

  
<実行例>
C:\java>java Ensyu0903
分子-->3
分母-->8
 (1) 0.1
 (2) 0.3
 (3) 0.375

C:\java>java Ensyu0903
分子-->2
分母-->0
 (1) 0.1
 (2) 0.2
【警告】分母は0を設定できません
 (3) Infinity

C:\java>
  
  
 
<演習4>
以下のプログラムで /* ここを作成する */ を作成して実行例のように動くようにしなさい。

ソースファイル名は Ensyu0904.java とする。
  
class Shinkansen // 新幹線を扱うクラス
{

  /* ここを作成する */

}

class Ensyu0904
{
  public static void main(String[] args)
  {
    Shinkansen nozomi = new Shinkansen();
    Shinkansen kodama = new Shinkansen();

    nozomi.setData( 16, 2.5 );
    kodama.setData( 8, 4.0 );

    System.out.print("のぞみ:");
    nozomi.showData();
    System.out.print("こだま:");
    kodama.showData();
  }
}

   
<実行例>
C:\java>java Ensyu0904
のぞみ: 車両=16両、所要時間=2.5(h)
こだま: 車両=8両、所要時間=4.0(h)

C:\java>
  

 
<演習5>
以下は、Numbersクラスを定義して1〜10の整数値を表示するプログラムである。
Numbersクラス
 (1) メンバに配列変数を持つ
 (2) 配列変数は10個の要素で、1〜10の値を代入
 (3) 10個の内容を表示する
の機能を持つ。
以下のNumbersクラスinitData() メソッドを削除して、かわりにコンストラクタを使用して処理するように修正しなさい。

ソースファイル名は Ensyu0905.java とする。
   
class Numbers // 数値を扱うクラス
{
  private int [] val; // 配列変数
  private int num; // 要素の個数

  // 10個の要素を確保、1,2,3・・・を代入する(このメソッドを削除する)
  public void initData(){
    num = 10;
    val = new int [num]; // 要素数numの領域を確保
    for(int i=0;i<num;i++) val[i] = i+1; // 値を代入
  }
  public void showData(){ // データを表示する
    for(int i=0;i<num;i++){
      System.out.print(" " + val[i]);
    }
    System.out.println("");
  }
}

class Ensyu0905
{
  public static void main(String[] args)
  {
    Numbers nm = new Numbers();

    nm.initData(); // 削除する
    nm.showData();
  }
}

  
<実行結果>
C:\java>java Ensyu0905
 1 2 3 4 5 6 7 8 9 10

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

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


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

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

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