2016-10-08 4 views
0
do { 
      loop = false; 
      if (userInput.equalsIgnoreCase("Score")){ 
       System.out.println("You have chose to input a score.\nEnter your score here: "); 
       score = kbInput.nextDouble(); 
       System.out.println("What was the best possible score?"); 
       total = kbInput.nextDouble(); 
       finalScore = score/total * 100; 
       percent = (finalScore + "%"); 
       if (finalScore >= 90){ 
        grade = 'A'; 
       } else if (finalScore >= 80){ 
        grade = 'B'; 
       } else if (finalScore >= 70){ 
        grade = 'C'; 
       } else if (finalScore >= 60){ 
        grade = 'D'; 
       } else { 
        grade = 'F'; 
       } 
       System.out.println("You got " + percent + ". Which is a letter grade '" + grade + "'."); 
       loop = false; 
      } else if (userInput.equalsIgnoreCase("Percent")) { 
       System.out.println("You have chosen to input a percent.\nEnter your percent here: "); 
       finalScore = kbInput.nextDouble(); 
       if (finalScore >= 90){ 
        grade = 'A'; 
       } else if (finalScore >= 80){ 
        grade = 'B'; 
       } else if (finalScore >= 70){ 
        grade = 'C'; 
       } else if (finalScore >= 60){ 
        grade = 'D'; 
       } else { 
        grade = 'F'; 
       } 
       System.out.println("You got a letter grade '" + grade + "'."); 
       loop = false; 
      } else { 
       System.out.println("Sorry, I don't understand that."); 
       loop = true; 
      } 
     } while (loop = true); 

Я довольно новичок в Java, и я занимаюсь классом и занимаюсь мини-проектами самостоятельно. Мой план состоял в том, чтобы цикл кода возвращался к началу всякий раз, когда вы достигли финального оператора if из-за ввода недопустимой строки (например, ничего, кроме показателя и процента). Я не могу понять, что не так, это только секторы цикла операторов if/else.Код ошибки при неправильном вводе

+1

Затем вам нужно заполнить 'userInput' внутри вашего цикла. –

+1

'==' для сравнения, '=' для присваивания ... также не сравнивать booleans, используя '=='. – Li357

ответ

4

Вы сделали классическую ошибку, которую создают Java-новички. Вы намеревались использовать ==, но случайно пропустили его как =. Вы можете исправить опечатку, но есть решение BETTER, которое позволит избежать этой проблемы в будущем.

Вы не должны использовать == для тестирования булевых элементов. Вместо этого, вы должны переписать код по следующей схеме:

while (loop = true) {  // BUG!!!  

while (loop == true) { // WRONG 

while (loop) {   // CORRECT 

while (loop = false) { // BUG!! 

while (loop == false) { // WRONG 

while (!loop) {   // CORRECT 

Этот совет относится и к значительной степени каждое использование == с логическими операндами. (Исключение составляет op1 == op2 где ниop1 или op2 являются булевыми литералами.)

UPDATE

Есть также проблемы с тем, как вы получаете информацию от пользователя.

  1. Вы не читаете userInput внутри цикла. Это может быть проблемой, в зависимости от требований, и от того, была ли она инициализирована до начала цикла.

  2. Если пользователь вводит неверное число с плавающей запятой, вы получите исключение. Это включает случай, когда пользователь вводит что-то вроде «100.0 баллов».

  3. Вы не проверяете входы; например тест на отрицательные оценки, баллы больше максимального, проценты за пределами диапазона 0..100.

И, наконец, то, как вы завершаете цикл, неуклюже. Было бы лучше, чтобы сделать что-то вроде этого:

while (true) { 
    // do stuff 
    if (...) { 
     // we want to terminate the loop 
     break; // <<------ 
    } 
    // do more stuff 
} 
+0

Это касается только одной из двух причин проблемы. Программа не будет исправлена. Стивен, ваши ответы обычно намного лучше, чем это. –

+0

Вы не имеете в виду 4? Ваши комментарии обычно лучше, чем это. Кроме того, НЕ ЗАПРЕЩАЕТСЯ исправить код в домашних заданиях. Это для ученика. –

+0

Ну, вы исправили это сейчас, с вашим обновлением. Это действительно хороший ответ. –

1

Поскольку вы до сих пор пытаются понять, вот это «пример решения» проблемы программирования:

import java.util.Scanner; 
import java.util.NoSuchElementException; 

public class Example { 
    public static void main(String[] args) { 
     Scanner kbdInput = new Scanner(System.in); 
     String mode = ""; 
     double percent = -1; 
     while (true) { 
      System.out.println("Enter 'score' or 'percent': "); 
      mode = kbdInput.next().toLowerCase(); 
      kbdInput.nextLine(); 
      if (mode.equals("score") || mode.equals("percent")) { 
       break; 
      } 
      System.out.println("I don't understand that. Try again."); 
     } 
     while (true) { 
      try { 
       if (mode.equals("score")){ 
        System.out.println("You chose to input a score."); 
        System.out.println("Enter it here: "); 
        double score = kbdInput.nextDouble(); 
        kbdInput.nextLine(); 
        System.out.println("What is the best score?"); 
        double total = kbdInput.nextDouble(); 
        kbdInput.nextLine(); 
        percent = score/total * 100; 
        if (score >= 0.0 && total > 0.0 && 
         percent >= 0.0 && percent <= 100.0) { 
         break; 
        } 
        System.out.println("The score/best score you " + 
         "gave make no sense."); 
       } else if (mode.equals("percent")) { 
        System.out.println("You chose to input a percent."); 
        System.out.println("Enter it here: "); 
        percent = kbdInput.nextDouble(); 
        kbdInput.nextLine(); 
        if (percent >= 0.0 && percent <= 100.0) { 
         break; 
        } 
        System.out.println("The percent you gave is not " + 
         "between 0 and 100."); 
       } 
      } catch (NoSuchElementException ex) { 
       kbdInput.nextLine(); 
       System.out.println("You entered an invalid number."); 
      } 
      System.out.println("Try again."); 
     } 
     if (percent >= 0.0 && percent <= 100.0) { 
      char grade; 
      if (percent >= 90){ 
       grade = 'A'; 
      } else if (percent >= 80){ 
       grade = 'B'; 
      } else if (percent >= 70){ 
       grade = 'C'; 
      } else if (percent >= 60){ 
       grade = 'D'; 
      } else { 
       grade = 'F'; 
      } 
      System.out.println("You got " + percent + 
        "%. Which is a letter grade '" + grade + "'."); 
     } 
    } 
} 

Вещи, чтобы отметить:

  1. Я разделил это на две петли. Один для запроса и проверки «режима» ввода баллов. А второй - фактически ввести их. (Я предположил, что это было требованием от вашего кода. Это может быть неверно.)

  2. Существует гораздо больше проверки входов, чем в вашей версии.

  3. Я использовал kbdInput.nextLine(), чтобы «потреблять» нежелательный вход в нескольких местах.Обратите внимание, что методы next оставляют любые входные символы, которые они не хотят или не могут распознать во входном буфере. Если вы не будете осторожны, следующий вызов nextXxxx попытается снова проанализировать те же символы.

  4. Я явно поймаю и обработаю ошибки при вводе чисел; см. обработчик исключений.

  5. Я перевел общий код для расчета и отображения оценки до конца.

  6. Я изменил ваши многострочные инструкции println в отдельные заявления. Для этого есть веская причина.

    • "\n" не всегда правильно способ вывести разрыв строки. Это зависит от платформы исполнения
    • println будет делать это правильно, считая, что выход предназначен для того же компьютера, на котором работает код.

    • Смотрите также: System.out.println() vs \n in Java

Наконец, этот код не будет иметь дело со случаем, когда пользователь вводит END-OF-FILE на клавиатуре (например,^D на Linux).

Упражнение: Посмотрите, что произойдет, если вы это сделаете. Выясните, что происходит, и найдите подходящее исправление.

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