エンジニア成長日記 swaponQ

コンピュータサイエンス専攻の一般人のブログです。

新・明解 Java 入門 演習 8-2 解答

Hello, Terminal!swaponQです!

今回は演習 8-2 に取り組んでいこうと思います。

  • 演習 8-2

自動車クラスCarに対して、フィールドやメソッドを自由に追加せよ。
(e.g. タンク容量を表すフィールドを追加する/ナンバーを表すフィールドを追加する/燃費を表すフィールドを追加する/移動による燃料残量の計算に燃費を反映させる/給油のためのメソッドを追加する)

ソースコード

class Car {
  private String name; //名前
  private int width; //幅
  private int height; //高さ
  private int length; //長さ
  private double x; //現在位置x座標
  private double y; //現在位置y座標
  private double fuel; //残り燃料
  private double economy; //燃費 <-追加
  //コンストラクタ
  Car(String name, int width, int height, int length, double fuel, double economy) {
    this.name = name;
    this.width = width;
    this.height = height;
    this.length = length;
    this.fuel = fuel;
    this.economy = economy;
    x = y = 0.0;
  }
  //各値の取得
  double getX() { return x; }
  double getY() { return y; }
  double getFuel() { return fuel; }
  //スペック表示
  void putSpec() {
    System.out.printf("名前:%s\n", name);
    System.out.printf("車幅:%d mm\n", width);
    System.out.printf("車高:%d mm\n", height);
    System.out.printf("車長:%d mm\n", length);
    System.out.printf("燃料:%f L\n", fuel);
    System.out.printf("燃費:%f km/L\n", economy);
  }
  //移動判定
  boolean move(double dx, double dy) {
    boolean flag = true;
    double dist = Math.sqrt(dx * dx + dy * dy);
    if ((dist / economy) > fuel) {
      flag = false;
    } else {
      fuel -= dist / economy;
      x += dx;
      y += dy;
    }
    return flag;
  }
  //給油 <-追加
  void chargeFuel(double charge) {
    fuel += charge;
  }
}

//---------------------------//

import java.util.Scanner;

class ex08_2 {
  public static void main(String[] args) {
    Scanner stdIn = new Scanner(System.in);
    Car myCar = new Car("Vitz", 1660, 1500, 3640, 100.0, 12.0);
    myCar.putSpec();
    while (true) {
      System.out.printf("現在地:(%f, %f)\n残り燃料:%f\n", myCar.getX(), myCar.getY(), myCar.getFuel());
      System.out.print("移動しますか[0…No/1…Yes]:");
      if (stdIn.nextInt() == 0) break;
      System.out.print("x方向の移動距離:");
      double dx = stdIn.nextDouble();
      System.out.print("y方向の移動距離:");
      double dy = stdIn.nextDouble();
      if (!myCar.move(dx, dy)) {
        System.out.println("燃料が足りません!");
        System.out.print("給油しますか[0…No/1…Yes]:");
        if (stdIn.nextInt() == 0) {
          break;
        } else {
          System.out.print("給油量:");
          double charge = stdIn.nextDouble();
          myCar.chargeFuel(charge);
        }
      }
    }
  }
}

今回はフィールドに燃費(economy)を追加し、残り燃料が足りなくなった際に給油をすることができるよう、給油メソッド(chargeFuel)を追加しました。

・実行結果

名前:Vitz
車幅:1660 mm
車高:1500 mm
車長:3640 mm
燃料:100.000000 L
燃費:12.000000 km/L
現在地:(0.000000, 0.000000)
残り燃料:100.000000
移動しますか[0…No/1…Yes]:1
x方向の移動距離:500
y方向の移動距離:500
現在地:(500.000000, 500.000000)
残り燃料:41.074435
移動しますか[0…No/1…Yes]:1
x方向の移動距離:500
y方向の移動距離:500
燃料が足りません!
給油しますか[0…No/1…Yes]:1
給油量:100
現在地:(500.000000, 500.000000)
残り燃料:141.074435
移動しますか[0…No/1…Yes]:1
x方向の移動距離:500
y方向の移動距離:500
現在地:(1000.000000, 1000.000000)
残り燃料:82.148870
移動しますか[0…No/1…Yes]:0

以上で「第8章:クラスの基本」は終了です。お疲れ様でした!
オブジェクト指向プログラミングをようやく学び始めた実感が出てきましたね。
次回からは「第9章:日付クラスの作成」です。
これからも頑張りましょう!

Goodbye, Terminal… swaponQでした!