Как проигнорировать неверный ввод пользователя и повторить тот же вопрос? - PullRequest
0 голосов
/ 21 апреля 2019

Когда пользователь вводит недопустимое значение, такое как строка или символ, программа должна игнорировать его и снова показывать предыдущий вопрос.До сих пор я могу заставить программу выйти только тогда, когда она обнаружит неправильный ввод.

Допустимые значения ввода int и "q", которые пользователь решил закрыть.

 public static void partB() {
 int score = 0;
 int correct = 0;
 int done = 0;
 Scanner scan = new Scanner(System.in);
 try {
     while (true) {
         int num1 = (int) (Math.random() * 20);
         int num2 = (int) ((Math.random() * 20) + 1);
         System.out.printf("%d  %% %d = ?\n", num1, num2);
         if (scan.hasNext("q")) break;
         if (scan.nextInt() == (num1 % num2)) {
             score += 20;
             done += 1;
             correct += 1;
             System.out.println("Correct answer,current score :" + score 
     + ",performance: "
                     + correct + "/" + done);
         } else {
             done += 1;
             System.out.println("Incorrect answer, Current score:" + 
      score
                     + ", performance: " + correct + "/" + done);
         }
     }
 } catch (InputMismatchException e) {
       System.out.println("invalid input"); //but this terminate program

    }
     System.out.println("Finish");
  }

И коддолжен работать так:

18 % 12 = ?
6
Correct answer, Current score: 20, performance: 1/1
14 % 16 = ?
a
Invalid input
14 % 16 = ?
14
Correct answer, Current score: 40, performance: 2/2
20 % 4 = ?
q
Finish.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

Ваш блок try / catch находится в неправильном положении.Он должен быть внутри вашего цикла, чтобы избежать разрыва цикла с неверным вводом:

  public static void main(String[] args) {
    int score = 0;
    int correct = 0;
    int done = 0;
    Scanner scan = new Scanner(System.in);
    while (true) {
      int num1 = (int) (Math.random() * 20);
      int num2 = (int) ((Math.random() * 20) + 1);
      System.out.printf("%d  %% %d = ?\n", num1, num2);
      if (scan.hasNext("q")) break;
      try {
        if (scan.nextInt() == (num1 % num2)) {
          score += 20;
          done += 1;
          correct += 1;
          System.out.println(
              "Correct answer,current score :" + score + ",performance: " + correct + "/" + done);
        } else {
          done += 1;
          System.out.println(
              "Incorrect answer, Current score:"
                  + score
                  + ", performance: "
                  + correct
                  + "/"
                  + done);
        }
      } catch (InputMismatchException e) {
        done += 1;
        scan.nextLine();
        System.out.println("invalid input"); // but this terminate program
      }
    }
    scan.close();
    System.out.println("Finish");
  }

Вы должны очистить сканер в блоке перехвата, чтобы избежать бесконечного цикла.

0 голосов
/ 21 апреля 2019

Вам нужно переместить try-catch внутрь блока while.Также, когда есть InputMismatchException, вы должны закончить чтение строки (потому что вы использовали Scanner#nextInt вместо Scanner#nextLine) и установить переменную (repeatValue) вtrue.С помощью этой переменной вы можете решить, нужно ли вам генерировать новые значения или использовать предыдущие.

Посмотреть работает здесь :

public static void main(String[] args) {
    int score = 0;
    int correct = 0;
    int done = 0;
    Scanner scan = new Scanner(System.in);
    boolean repeatValue = false;
    int num1 = 0; // put values outside while in order to re-use them when we need to repeat the same question
    int num2 = 0;
    while (true) {
        try {
            // if the user input was incorrect (repeatValue = true), use old the previous values for num1 and num2
            num1 = repeatValue ? num1 : (int) (Math.random() * 20);
            num2 = repeatValue ? num2 : (int) ((Math.random() * 20) + 1);
            System.out.printf("%d  %% %d = ?\n", num1, num2);
            repeatValue = false;  // restore flag state
            if (scan.hasNext("q"))
                break;
            if (scan.nextInt() == (num1 % num2)) {
                score += 20;
                done += 1;
                correct += 1;
                System.out.println(
                        "Correct answer,current score :" + score + ",performance: " + correct + "/" + done);
            } else {
                done += 1;
                System.out.println(
                        "Incorrect answer, Current score:" + score + ", performance: " + correct + "/" + done);
            }
        } catch (InputMismatchException e) {
            System.out.println("invalid input");
            scan.next();
            repeatValue = true; // flag set to use the same values as before
        }
    }
    System.out.println("Finish");
}
...