質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.12%

javaの自動車クラスの問題

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,194

kusakalien

score 11

前提・実現したいこと

独学で取り組んでいるとある問題集の演習問題をやっててわからないことがあるので
ご教授お願いします。

発生している問題・エラーメッセージ

コンパイルエラーは出ていません。
試したことにエラー内容を書きました。

該当のソースコード

// 自動車クラス【第1版】

class Car {
private String name;    // 名前
private int width;        // 幅
private int height;        // 高さ
private int length;        // 長さ
private int number;         // ナンバー
private double x;        // 現在位置X座標
private double y;        // 現在位置Y座標
private double capa;        // タンク容量
private int cons;           // 燃費
private double fuel;        // 残り燃料
private double plusfuel;  // 給油燃料

// コンストラクタ
Car(String name, int width, int height, int length, int number, double capa, int cons, double fuel) {
this.name = name;         this.width = width;    this.height = height;
this.length = length;    this.number = number;  this.capa = capa;
this.cons = cons;       this.fuel = fuel;      plusfuel = x = y = 0.0;
}

double getX()    { return x; }    // 現在位置X座標を取得
double getY()    { return y; }    // 現在位置Y座標を取得
double getFuel() { return fuel; }    // 残り燃料を取得

// スペック表示
void putSpec() {
System.out.println("名前:" + name);
System.out.println("車幅:" + width  + "mm");
System.out.println("車高:" + height + "mm");
System.out.println("車長:" + length + "mm");
System.out.println("ナンバー : " + number);
System.out.println("タンク容量 : " + capa + "L");
System.out.println("燃費 : " + cons + "km/L");
}

// 残り燃料がタンク容量をオーバーしていないか判断
boolean over(double capa, double fuel) {
if (capa >= fuel)
return true;
else
return false;
}

// 最初に入っているガソリン量を変更
double setFuel(double fuel) {return this.fuel = fuel;}

// X方向にdx・Y方向にdy移動
boolean move(double dx, double dy) {
double dist = Math.sqrt(dx * dx + dy * dy);        // 移動距離

if (dist > fuel)
return false;                // 移動できない … 燃料不足
else {
fuel -= dist/cons;                // 移動距離の分だけ燃費に応じて燃料が減る
x += dx;
y += dy;
return true;                // 移動完了
}
}

// 給油
double refueling(double plusfuel) {return this.fuel += plusfuel;}
}


// 自動車クラス【第1版】の利用例(その2:対話的に自動車を移動)

import java.util.Scanner;

class CarTester3 {

public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);

System.out.println("車のデータを入力せよ。");
System.out.print("名前は : ");            String name = stdIn.next();
System.out.print("車幅は : ");            int width = stdIn.nextInt();
System.out.print("高さは : ");            int height = stdIn.nextInt();
System.out.print("長さは : ");            int length = stdIn.nextInt();
System.out.print("ナンバーは : ");                 int number = stdIn.nextInt();
System.out.print("タンク容量は : ");            double capa = stdIn.nextDouble();
System.out.print("燃費は : ");                  int cons = stdIn.nextInt();
System.out.print("ガソリン量は : ");            double fuel = stdIn.nextDouble();        

Car myCar = new Car(name, width, length, number, height, capa, cons, fuel);

do {
if (!myCar.over(capa, fuel)) {
System.out.println("燃料がキャパをオーバーしています!");
System.out.print("ガソリン量は : ");   fuel = stdIn.nextDouble();
}
else {
myCar.setFuel(fuel);
break;
}
}while(true);

while (true) {
System.out.println("現在地(" + myCar.getX() + ", " + myCar.getY() +
")・残り燃料 " + myCar.getFuel());
System.out.print("移動しますか[0...No/1...Yes] 給油しますか[2...Yes]:");
if (stdIn.nextInt() == 0) break;

if (stdIn.nextInt() == 1) {
System.out.print("X方向の移動距離 : ");
double dx = stdIn.nextDouble();
System.out.print("Y方向の移動距離 : ");
double dy = stdIn.nextDouble();
if (!myCar.move(dx, dy))
System.out.println("燃料が足りません!");
}

else if (stdIn.nextInt() == 2) {
System.out.print("何L給油しますか : ");   double plusfuel = stdIn.nextDouble();
myCar.refueling(plusfuel);
}
}
}
}

試したこと

実行してみると「移動しますか」の段階で0を選ぶと、ちゃんとそこで終わってくれますが、
1や2を選ぶと改行されただけでそれ以降何も表示されなくなってしまいます。
どのようにすればちゃんと1や2に分岐されるようになるのでしょうか?

補足情報(言語/FW/ツール等のバージョンなど)

java

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

while (true)のループ内の処理に問題があるようです。

「if (stdIn.nextInt() == 0)」の「stdIn.nextInt()」で入力待ちになります。
1を入力すると結果がfalseになり、次の「if (stdIn.nextInt() == 1)」で入力待ちになります。

やり方いことは以下だと思います。

// 修正案
            int inputNumber = stdIn.nextInt();

            if (inputNumber == 0)
                break;

            if (inputNumber == 1) {
                System.out.print("X方向の移動距離 : ");
                double dx = stdIn.nextDouble();
                System.out.print("Y方向の移動距離 : ");
                double dy = stdIn.nextDouble();
                if (!myCar.move(dx, dy))
                    System.out.println("燃料が足りません!");
            } else if (inputNumber == 2) {
                System.out.print("何L給油しますか : ");
                double plusfuel = stdIn.nextDouble();
                myCar.refueling(plusfuel);
            }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/27 19:12

    解決しました!ありがとうございます!

    キャンセル

0

以下の箇所でメッセージ表示して入力待ち

System.out.print("移動しますか[0...No1...Yes] 給油しますか[2...Yes]:"); 
if (stdIn.nextInt() == 0) break;

ここで「1」を入力してEnterすると、以下の箇所が実行されるのでまた入力待ちになる。

if (stdIn.nextInt() == 1) {

もう一回「1」を入力してEnterすると、以下の箇所が実行されてメッセージ表示して入力待ちとなる。

System.out.print("X方向の移動距離 : "); 
double dx = stdIn.nextDouble();

stdIn.nextInt()を実行するとそこで入力待ちになりますが、問題のソースコードでは変数を確認する感覚で呼び出しているため、意図した動作と異なる結果になっています。

ユーザ入力で受け取った値を複数回評価する場合は、一旦変数に格納してください。

while(true)
    System.out.print("移動しますか[0...No/1...Yes] 給油しますか[2...Yes]:"); 
    int menuItem = stdIn.nextInt();
    if (menuItem == 0) {
      break;
    } else if (menuItem == 1) {
      ;
    } else if (menuItem == 2) {
      ;
    }
  }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る