2015-04-23 8 views
0

Следующая программа, которую я написал для активности класса, чтобы запросить у пользователя бесконечное количество тестовых меток от 0 до 100, и когда пользователь вводит знак вне этого диапазона, он должен сообщить пользователю что его недействительный (который работает до сих пор в моей программе). Когда пользователь вводит «-1», он должен остановить программу, а затем распечатать среднее значение этих меток.Я не могу выбраться из цикла while

import java.util.*; 

public class HmWk62 { 

    static Scanner console = new Scanner(System.in); 

    public static void main(String[] args) { 


     int count=1; 
     int mark, total=0; 
     double average; 

     System.out.println("please enter mark "+count); 
     mark = console.nextInt(); 
     count++; 

     while ((mark >= 0)&&(mark <= 100)){ 
      System.out.println("Please enter mark "+count); 
      mark = console.nextInt(); 
      total += mark ; 
      ++count; 

      while ((mark < 0)||(mark > 100)){ 
       System.out.println("Invalid mark, please re-enter"); 
       mark = console.nextInt(); 
      } 
     } 
    } 
} 
+0

Я sugged '' 'сделать {/ * задать для ввода и продолжить, если 0-100 */... } while (/ * check input is not -1 * /); '' 'loop better –

+1

Вы устали отлаживать свой код? – Jens

+0

Вы можете использовать законы демонации, чтобы доказать, что условие внутреннего цикла while является отрицанием условия внешнего цикла.Это означает, что когда вы входите в внешний цикл, ваша программа обречена на показ до тех пор, пока она не будет убита (поскольку после внутреннего цикла while это условие «false», и поэтому условие внешнего цикла равно «true»). – fabian

ответ

5

Когда пользователь вводит «-1» его следует остановить программу, а затем распечатать в среднем этих марок.

Ну, если пользователь вводит -1, вы никогда не выйдете из цикла вложенной, которая проверяет ввод.

Если вы хотите разрешить -1, вы должны изменили состояние во вложенном цикле, чтобы его:

while (mark < -1 || mark > 100) 

отметить также, что вы с помощью значение mark, прежде чем проверить его - поэтому, если вы введете 10000, вы все равно добавите 10000 к total, прежде чем вы затем попросите новое значение - и вы проигнорируете новое значение.

Кроме того, вы не используете первое значение mark, введенное вообще, кроме того, чтобы видеть, следует ли вводить цикл.

Я подозреваю, что вы на самом деле хотите что-то вроде:

while (true) { 
    int mark = readMark(scanner, count); 
    if (mark == -1) { 
     break; 
    } 
    count++; 
    total += mark; 
} 
// Now print out the average, etc 

... 

private static int readMark(Scanner scanner, int count) { 
    System.out.println("Please enter mark " + count); 
    while (true) { 
     int mark = scanner.nextInt(); 
     if (mark >= -1 && mark <= 100) { 
      return mark; 
     } 
     System.out.println("Invalid mark, please re-enter"); 
    } 
} 
0

Пусть ваш чек-код, если глобальная переменная установлена.

Например, создать переменную: boolean userCancelled = false;

в чеке, а петли, эту переменную: как:.

while (userCancelled != false && (mark >= 0)&&(mark <= 100)) 
{ 
} 
-1

Внутренний пока контур затем один вы застряли в

С одной стороны, для выхода требуется недействительная метка, , а с другой, программа отклоняет недействительные отметки и продолжает просить, пока вы не введете допустимую отметку.

Результат - вы застряли.

Решение: Изменение внутренней while к if, и поместите средний код расчета и System.exit() в if блоке.

+0

Я бы не рекомендовал использовать 'System.exit()' * в любом месте *, если вам действительно не нужно. Это делает код еще сложнее проверить, чем он есть. Есть намного более чистые способы выхода из цикла, чем остановка JVM ... –

0

Я предлагаю вам заменить петлю while с этим do while loop, как показано ниже:

do { 
     System.out.println("Please enter mark "+count); 
     mark = console.nextInt(); 
     if(mark == -1){ 
      break; 
     }else if((mark >= 0)&&(mark <= 100)){ 
      total += mark ; 
      ++count; 
     }else{ 
      System.out.println("Invalid mark, please re-enter"); 
      mark = 0; 
     } 
    } while ((mark >= 0)&&(mark <= 100)); 
Смежные вопросы