2015-05-26 2 views
-2

В качестве нового занятия я попросил сделать «класс», который напоминает функциональность автомобиля с использованием определенных требований.Как решить эти ошибки при проверке?

Класс должен использовать эти атрибуты:

state (int) 
fuel (int) 
maxspeed (int) 

состояния являются следующим:

0 = turned off 
1 = stopped 
2 = accelerating 
3 = not functional 
4 = no fuel 

Я должен создать следующие методы:

"accelerate", it should receive a number as speed 
"brake" 
"crash" 

Теперь, валидация являются следующим образом:

The car can not accelerate if it is turned off (0), not functional (3), or no fuel (4). 

It cannot accelerate more than maximum speed. 

When there's a crash the car goes not functional (3) 

Every time the car accelerates it loses 2 of fuel units 

Теперь валидации могут показаться простыми, но почему-то у меня возникают проблемы с проверкой, когда автомобиль ускоряется или нет. В моем коде автомобиль продолжает ускоряться даже после аварии или без топлива. Он также изменяет состояние после аварии, выключается или когда без топлива.

Это мой код:

private int state; 
private int fuel; 
private int speed; 


public car() // constructor 
{ 
    this.state = 1; 
    this.fuel = 30; 
    this.speed = 0; 
    int Maxspeed = 200; 
} 

public void setState(int state){ 
    switch(state){ 
     case 0: 
      this.state = 0; 
      this.speed = 0; 
      break; 
     case 1: 
      this.state = 1; 
      this.speed = 0; 
      break; 
     case 2 : 
      this.state = 2; 
      break; 
     case 3 : 
      this.state = 3; 
      this.speed = 0; 
      break; 
     case 4 : 
      this.state = 4; 
      this.speed = 0; 
      this.fuel = 0; 
      break;  

    } 
} 

public void accelerate(int v){ 


    if(this.state == 0 || this.state == 3 || this.state == 4){ 
     v = 0; 
     this.speed = v;     

    } 

    if(this.fuel != 0 && this.state != 4 || this.state != 3){ 
     if(v > 200 || this.speed == 200){ 
      if(this.fuel < 30){ 
       this.speed = 200; 
       this.state = 2; 
      } 
      else{ 
      this.speed = 200; 
      this.state = 2; 
      this.state -= 2; 
      } 
       } 
       else{ 
        this.speed += v; 
        this.fuel -= 2; 
        this.state = 2; 
       } 
      }       
     } 

public void Stop(){ 
    while(this.state == 2){ 
     this.speed = 0; 
     this.state = 1; 
    } 

    } 

public void Crash(){ 
    if(this.state == 2){ 
     this.state = 3; 
     this.speed = 0; 
    } 
} 

} 

Кроме того, он не просил об осуществлении, но как я мог бы сделать состояние видимым со строками, вместо цифр?

Я также прошу протестировать это, используя основную систему void, но я не совсем уверен, как сделать соединения. Любая помощь?

+1

Состояние должно действительно быть перечислением. Если вы еще не должны использовать перечисления, по крайней мере объявите константы для своих состояний и используйте имена констант, а не 1, 2, 3, 4, 5: 'if (state == STOPPED)' намного яснее, чем 'if (state == 1)'. –

+0

'public static void main (String [] args) {...}' является точкой входа для многих программ Java. Здесь начинается программа, а 'String [] args' - это любые аргументы командной строки, переданные в программу при ее запуске. В 'main()' вам нужно создать 'new Car();', а затем вызвать разные методы из класса 'Car'. Но теперь я должен спросить; если вы не используете метод 'main()', как вы используете свой код? –

+1

@JBNizet Похоже, что PBRD довольно рано в своем первом курсе Java. Давайте не будем путать их с лучшими методами качества кода, прежде чем они даже поймут основы. –

ответ

1

Ваша основная проблема в if (this.fuel != 0 && this.state != 4 || this.state != 3) {, для меня это строка 52. Похоже, вы скопировали ошибку копирования-вставки из строки 46. this.state != 4 будет оценивать значение true, если только состояние равно 4. this.state != 3 будет оценивать значение true, за исключением случая, когда состояние равно 3. this.state != 4 || this.state != 3 всегда будет оцениваться как истинный, поскольку один из двух будет всегда будь настоящим. То есть, (true || anything) == true. Измените || на &&.

Далее, если вашему автомобилю когда-либо дается странное количество топлива, оно будет работать вечно. Каждая линия, которая уменьшает количество топлива, делает это на 2, и вы проверяете, fuel != 0. Если топливо находится на -1, то fuel != 0 правдиво, хотя ваш автомобиль, как предполагается, не горит. Вместо этого вы хотите проверить, что топливо положительное, т. Е. fuel > 0.

И, наконец, строка 61 вы меняете this.state вместо this.fuel.

Я рекомендую изменять все места в accelerate(v), stop() и crash(), где вы установите this.state == s вместо этого позвонить setState(s) так, что setState() обрабатывает изменения бокового эффекта (например, топлива и скорости) вместо того, чтобы дублировать ту же функциональность в каждом из эти три места.

Кроме того, это не задано в упражнении, но как я могу сделать состояние видимым со строками, а не цифрами?

Создайте метод, который возвращает строку в соответствии с состоянием автомобиля.Что-то вроде:

public String getStateName() { 
    switch (state) { 
     case 0: return "turned off"; 
     case 1: return "stopped"; 
     case 2: return "accelerating"; 
     case 3: return "not functional"; 
     case 4: return "no fuel"; 
     default: return null; 
    } 
} 

(обратите внимание, что каждый case будет return значение, поэтому они не нуждаются в break в конце каждого дела.)

Я также просил проверьте это, используя System void main, но я не совсем уверен, как сделать соединения. Любая помощь?

Добавить метод public static void main(String[] args) { ... }, который является точкой входа в вашу программу. Создайте переменную new Car(), затем вызовите различные методы этого автомобиля и используйте System.out.println(...), чтобы распечатать необходимую информацию на консоли. Пример:

public static void main(String[] args) { 
    // make a Car. 
    Car myCar = new Car(); 
    myCar.printCarStatus(); 

    // turn the car on 
    myCar.setState(1); 
    myCar.printCarStatus(); 

    // speed up 
    myCar.accelerate(20); 
    myCar.printCarStatus(); 

    // brake 
    myCar.stop(); 
    myCar.printCarStatus(); 

    // speed up, put the pedal to the metal 
    myCar.accelerate(1000); // car tops out at 200 
    myCar.printCarStatus(); 

    // lost control of my car, crash 
    myCar.crash(); 
    myCar.printCarStatus(); 
} 

public void printCarStatus() { 
    System.out.println("State: " + this.state); 
    System.out.println("Fuel: " + this.fuel); 
    System.out.println("Speed: " + this.speed); 
    System.out.println(); // prints an empty line so we don't get entries mixed up. 
} 

Но написать свой собственный main() метод, не просто скопировать мой. Помните - вы учите класс, поэтому попробуйте все и экспериментируйте. Если вы просто скопируете мой пример и вставьте его в свой код, вы обманываете себя. Удачи там!

+0

Спасибо, что рассказала мне, что я ошибался. Теперь я пытаюсь сделать основной класс работы. Но всякий раз, когда я вызываю «this.anything», я получаю сообщение об ошибке, что символ не может быть найден. – PBRD

+0

Если вы вызываете 'this.anything' в' main() ', это проблема. 'main()' является статическим методом, но все методы для вашего класса 'Car', кроме него, являются методами экземпляра. Это означает, что вам нужно вызвать их из объекта «Car». Таким образом, в моем 'main()', я начинаю с «Car myCar = new Car();», а затем я использую 'myCar' вместо' this' для всех последующих действий. –

+0

Это означает, что метод печати должен находиться на объекте автомобиля? – PBRD

Смежные вопросы