0

私は学生です、そして、はい、これは私の宿題です。私は先週、メモを確認し、本を読み、ネット上で関連するトピックを調査することに費やしましたが、問題が何であるかがわかりません。私が間違っていることを教えてもらえますか?どんな助けでも大歓迎です。(私はメモ帳とコマンドプロンプトのみを使用しています。)

私が与えられたガイドライン:2つのクラスで構成されるJavaアプリケーションを作成します。クラス1がアプリケーションクラスになります。クラス2はCarと呼ばれるクラスになります。アプリケーションは、novaと呼ばれるCarのインスタンスを作成し、それを駆動します。

車のルール:

  • 車が始動していないと運転できません(コンソールにエラーメッセージを送信してください)。
  • 車が始動していないと停止できません(コンソールにエラーメッセージを送信してください)。
  • 車がすでに始動している場合は始動できません(コンソールにエラーメッセージを送信してください)。
  • 車に運転するように指示したら、停止するだけです(コンソールにメッセージを送信します)
  • 停止を呼び出すと、車は初期状態に戻り、ユーザーは他の機能を実行する前に車を始動する必要があります。(コンソールにメッセージを送信します)

showStateメソッドの目的は、車の状態を検査する方法を提供することです。メッセージを作成し、コンソールに送信できるようにする必要があります。

私のコード:

public class MyAppAssignment3
{
   public static void main (String[] args)
   {
       System.out.println("Scenario 1");
       Car nova1 = new Car();
       nova1.start();
       nova1.showState();
       nova1.drive();
       nova1.stop();
       nova1.showState();
       System.out.println("");

       System.out.println("Scenario 2");
       Car nova2 = new Car();
       nova2.showState();
       nova2.drive();  //needs to send error message - can't drive a car that's not started
       nova2.stop();
       nova2.showState();
       System.out.println("");

       System.out.println("Scenario 3");
       Car nova3 = new Car();
       nova3.showState();
       nova3.start();
       nova3.showState();
       nova3.stop();   //needs to send error message - can't stop a car that's not driving
       nova3.showState();
       nova3.drive();
       nova3.stop();
   }
}

class Car
{
   private boolean isStarted;
   private boolean isDriving;
   private boolean isStopped;
   private String showState;

   public Car()
   {
       this.showState = showState;
   }

   public void start()
   {
       isStarted = true;
       isDriving = false;
       isStopped = false;
       System.out.println("The car is " + this.showState);
   }

   public void drive()
   {
       isStarted = false;
       isStopped = false;
       isDriving = true;
       System.out.println("The car is " + this.showState);
   }

   public void stop()
   {
       isStopped = true;
       isStarted = false;
       isDriving = false;
       System.out.println("The car is " + this.showState);
   }

   public String showState()
   {
       if (isStarted)
       {
           showState = "started";
       }
       else if(isDriving)
       {
           showState = "driving";
       }
       else if(isStopped)
       {
           showState = "stopped";
       }
       System.out.println("The car is " + this.showState);
       return showState;
   }
}

私の出力(これはすべて間違っています-値は正しくありません):

Scenario 1
The car is null
The car is started
The car is started
The car is started
The car is stopped

Scenario 2
The car is null
The car is null
The car is null
The car is stopped

Scenario 3
The car is null
The car is null
The car is started
The car is started
The car is stopped
The car is stopped
The car is stopped

これがすべて不安定な投稿をした場合は申し訳ありません。私はそれをうまくタイプしましたが、プレビューは厄介に見えます。

4

8 に答える 8

4

これは実際には何もしていません...

public Car()
{
    this.showState = showState;
}

基本的に、同じ値を自分自身に再割り当てするだけです。私はおそらくの初期状態に変更しますstopped

ごちゃごちゃになる可能性のある状態にenum頼るのではなく、車の状態に使用します...boolean

public enum CarState {
    Stopped,
    Started,
    Driving
}

次に、それを単一のstate変数に割り当てるだけです...

class Car
{
    private CarState state;

    public Car()
    {
       this.state= CarState.Stopped;
    }

    public void start()
    {
        if (state.equals(State.Stopped)) {
            state = CarState.Started;
            showState();
        } else {
            System.error.println("Car is not in a valid state to be started");
        }
    }

    public void drive()
    {
        if (state.equals(State.Started)) {
            state = CarState.Driving;
            showState();
        } else {
            System.error.println("Car is not in a valid state to be driven");
        }
    }

    public void stop()
    {
        if (state.equals(State.Driving)) {
            state = CarState.Stopped;
            showState();
        } else {
            System.error.println("Car is not in a valid state to be stopped");
        }
    }

    public String showState()
    {
        System.out.println("The car is " + state);
    }
}

あなたが抱えているもう1つの問題は、showStatus状態を変更したときに呼び出されていないことです。これは、現在の状態をshowState変数に割り当てていません...これを使用して修正しましたenum

于 2012-10-02T01:03:58.600 に答える
2

1 つは、新しいインスタンスを作成することです。これらのインスタンスのデフォルトを実際に設定することはありません。

少なくとも次のようなことを検討してください。

public Car()
{
    isStopped = true;
}

そうすれば、最初に呼び出すときに、nova1.start();再起動を許可する前に isStopped が true かどうかを確認できます...

public void start()
{
    if(isStopped)
    {
        isStarted = true;       
        isDriving = false;       
        isStopped = false;   
        showState = "started";    
        System.out.println("The car is " + this.showState);
    }
}

ほんの一例です。ただし、それを使用して、残りのニーズを簡単に推測できます。私のポイントは、主にインスタンスを作成するが、ブール値が指定されていない値を持つことを期待するということです。これは、デフォルトまたはコンストラクターで行うことができます。

例えば:

private boolean isStarted = false;
于 2012-10-02T00:56:18.227 に答える
1

これはうまくいきました!すべての助けをありがとう!

public class MyAppAssignment3
{
    public static void main (String[] args)
    {
        System.out.println("Scenario 1");
        Car nova1 = new Car();
        nova1.start();
        nova1.showState();
        nova1.drive();
        nova1.stop();   
        nova1.showState(); 
        System.out.println("");

        System.out.println("Scenario 2");
        Car nova2 = new Car();
        nova2.showState();
        nova2.drive();
        nova2.stop();
        nova2.showState();
        System.out.println("");

        System.out.println("Scenario 3");
        Car nova3 = new Car();
        nova3.showState();
        nova3.start();
        nova3.showState();
        nova3.stop();
        nova3.showState();
        nova3.drive();
        nova3.stop();
    }
}

class Car
{
    private boolean isStarted;
    private boolean isDriving;
    private boolean isStopped;
    private String showState;

    public Car()
    {
        isStarted = false;
        isDriving = false;
        isStopped = true;
    }

    public void start()
    {
        if(isStarted == false)
        {
            isStopped = false;
            isStarted = true;
            showState();
        }
        else
        {
            System.out.println("You can't start a car which is already started.");
        }

    }

    public void drive()
    {
        if(isStarted)
        {
            isDriving = true;
            showState();
        }
        else
        {
            System.out.println("You can't drive a car which is not started.");
        }

    }

    public void stop()
    {
        if(isStarted)
        {
            isStarted = false;
            isDriving = false;
            isStopped = true;
            showState();
        }
        else
        {
            System.out.println("You can't stop a car which is not started.");
        }

    }

    public String showState()
    {
        if(isStarted && (isDriving == false))
        {
            showState = "started";
        }
        else if(isStarted && isDriving)
        {
            showState = "driving";
        }
        else if(isStopped)
        {
            showState = "stopped";
        }
        System.out.println("The car is " + this.showState + ".");
        return showState;
    }

}
于 2012-10-02T20:37:33.423 に答える
1

列挙型を使用するのは良い考えです。これは、列挙型を使用した実装、デフォルトの実装を備えた列挙型、および型システムを使用した独自の実装です。また、if や switch のような条件分岐もありません。純粋で美しい Java コードです。

public class Car {
private enum State {
  OFF {
    void start(Car c) {
      System.out.println("Starting the car");
      c.state = State.STARTED;
    }
  }, 
  STARTED {
    void stop(Car c) {
      System.out.println("Stopping the car");
      c.state = State.OFF;
    }
    void drive(Car c) {
      System.out.println("Driving the car");
      c.state = State.DRIVING;
    }
  }, 
  DRIVING {
    void stop (Car c) {
      System.out.println("Stopping the car");
      c.state = State.OFF;
    }
  };

  void start(Car c) {
    System.err.println("Can't start");
  }

  void stop(Car c) {
    System.err.println("Can't stop");
  }

  void drive(Car c) {
    System.err.println("Can't drive");
  }
}
  private State state = State.OFF;

  public void start(){
    state.start(this);
  }

  public void stop(){
    state.stop(this);
  }
  public void drive() {
    state.drive(this);
  }

  public void showState(){
    System.out.println("The car is "+state);
  }
}
于 2012-10-02T01:41:02.103 に答える
0

各ステップで変数の値を出力してみてください。論理フローにはいくつかの問題があります。たとえば、コンストラクターを確認します。

public Car()
{
   System.out.println(showState);
   this.showState = showState;
}

コンストラクターに渡されるshowState値はなく、関数内でも初期化されません。

また、各関数の開始、停止、および駆動の内部には、次のように記述する必要があります。

  System.out.println("The car is " + this.showState());

それ以外の :

  System.out.println("The car is " + this.showState);
于 2012-10-02T01:10:51.837 に答える
0

私が提案するのはこれです。各車には独自の一意の ID があります。

 class Car
{
   private boolean isStarted;
   private boolean isDriving;
   private boolean isStopped;
   private String showState;
   private int id;

   public Car(Integer id)
   {
       this.id = id;
   }
...

}

次に、印刷すると言うすべての場所に、idも含めます。

System.out.println("The car id "+id+" is "+ this.showState);

次に、そのようなオブジェクトを作成します。

Car nova1 = new Car(1);

Car nova2 = new Car(2);

Car nova3 = new Car(3);

それは解決ではありませんが、解決への道を示します。あなたは解決策を見つけ、あなたはそれが味だと感じるでしょう

于 2012-10-02T00:52:54.297 に答える
0

求められたものをコードに変換する必要があります。ご覧のとおり、実際の要件にかなり近いものです。例:

車が始動していない場合、車を運転することはできません(コンソールにエラー メッセージを送信します)。

になります:

public void drive()
{

    if( this.isStarted == false ){

        System.out.println("You should start the car first!");

    }else{

        System.out.println("Car is running!");

    }

}

!this.isStartedの省略形として書くことができることに注意してくださいisStarted == false

于 2012-10-02T01:01:00.200 に答える
0

簡単にしましょう。必要な変数が 2 つしかないのに、なぜ 3 つの変数を使用するのでしょうか。私が間違っている場合は正しいですが、車が始動せず、あなたが運転していない場合、それは停止していますよね? 私のクラスを見てください:

public class car
{
private boolean isStarted;
private boolean isDriving;

public car()
{
    isStarted = false;
    isDriving = false;
    //Initial State
    showState();
}

public void start()
{
    if(!isStarted)
    {
        if(!isDriving)
            isStarted = true;
    }
    else
        System.err.println("You can\'t start a car which is already started"); //You can’t start a car if it is already started (send an error message to the console).
        showState();
}   

public void drive()
{
    if(isStarted)
        isDriving = true;
    else
        System.err.println("You can\'t drive a car which is not started");

    showState();
}

public void stop()
{
    if(isStarted)
    {
        isStarted = false;
        isDriving = false;
        // Once you call stop, the car will return to the initial state and the user must start the car before attempting to do any other functions. (Send a message to the console. (Below on ShowState)
    }
    else
        System.err.println("You can\'t stop a car which is not started"); // You can’t stop a car if it is not started (send an error message to the console).
    showState(); // Once you tell the car to drive, the only thing you can do is stop (Send a message to the console)
}

public void showState()
{
    if(isStarted && isDriving)
        System.out.println("It\'s Driving");
    if(!isStarted && !isDriving)
        System.out.println("It\'s Stopped");
    if(isStarted && !isDriving)
        System.out.println("It\'s Started");
}

}

お役に立てば幸いです。乾杯

于 2012-10-02T01:21:07.183 に答える