Цикл Java по умолчанию выполняет три итерации - PullRequest
0 голосов
/ 08 сентября 2018

Я начинаю изучать Java и пробую цикл while, я написал простую программу в виде простой игры в догадки, где пользователь пытается угадать букву между A и Z, и компьютер напечатает «правильно» и повторяет, если угадал букву неправильно, однако, каждый раз, когда я пытаюсь запустить его, вывод по умолчанию состоит из трех итераций, я пытался изменить цикл while на do-while и получал тот же вывод, я даже добавил переменную int i как счетчик, чтобы увидеть, действительно ли он выполняет 3 итерации, а значение i всегда равно 4 (3 неправильных итерации, когда на самом деле должно быть 1 плюс 1, когда я ввожу правильный ответ).

Можете ли вы сказать мне, какую ошибку я делаю?

class Guess {
    public static void main (String[] args) throws java.io.IOException {
        char answer = 'K', ignore, ch = 'a';
        int i=0;

        while (ch != 'K') {
            System.out.println("I am Thinking of a letter between A and Z, can you guess it?");
            ch = (char) System.in.read();
            if (ch !='K') 
                System.out.println("Wrong ! please try again");
            i++;
        }
        System.out.println("Correct!, you guessed after "+i+" attempts");
    }

}

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Привет, у меня для тебя есть совет. Я лично использовал бы Сканер вместо System.in.read. Сканер - это объект, который читает входные данные.

Чтобы создать его, просто наберите следующее:

Scanner sc = new Scanner(System.in); //System.in referes to a console input

Чтобы узнать, что набрал пользователь, используйте sc.nextLine();, который возвращает, как я уже сказал, ввод. Однако он возвращает String, а не char. Таким образом, в этом случае вам также необходимо изменить тип 'ch'.

Для сравнения ответов с вводом вам необходимо использовать метод equals(). По сути, если две вещи совпадают, возвращается true.

Тем не менее, ваш код должен выглядеть следующим образом:

    Scanner sc = new Scanner(System.in);
    String answer = "K",ch;

    int i=0;
    boolean correct = false;
    while (!correct) { 
        System.out.println("I am Thinking of a letter between A and Z, can you guess it?");
        ch = sc.nextLine();
        i++;
        if (!ch.toUpperCase().equals(answer)) { // or ch.equals(answer) == false
            System.out.println("Wrong ! please try again");
         }else{ //if they are the same
             correct = true; //the answer is correct so you can leave the while loop
             System.out.println("Correct!, you guessed after "+i+" attempts");
         }

    }
    sc.close(); //you should always close a scanner after you use it, but you can ignore this step for now

Обратите внимание, что я также использовал метод под названием toUpperCase(). Этот метод преобразует все символы строки в верхний регистр, поэтому, даже если вы введете «k» вместо «K», вы также выйдете из цикла.

0 голосов
/ 08 сентября 2018

Проблема заключается в том, что при нажатии Ввод после ввода символа в консоли цикл выполняется один раз для введенного символа и еще раз один раз для новой строки, равной 10.

Так что я просто отредактировал ваш код, чтобы пропустить новую строку и дождаться ввода следующего символа. Также я переместил начальную подсказку за пределы цикла. Я надеюсь, что этот код исправит вашу проблему:

public static void main(String[] args) throws IOException {
        char answer = 'K', ignore, ch = 'a';
        int i = 0;
        System.out.println("I am Thinking of a letter between A and Z, can  you guess it?");
        while (ch != 'K') {
            ch = (char) System.in.read();
            if(!Character.isLetter(ch)){
                continue;
            }
            System.out.println("Wrong ! please try again");
            i++;
        }

        System.out.println("Correct!, you guessed after " + i + " attempts");

    }
0 голосов
/ 08 сентября 2018

Вот как это должно выглядеть. Ваш код только что пропустил блок else, который очень необходим для выхода из цикла, когда пользователь угадывает правильный символ. Я добавил один.

class guess {
    public static void main (String[] args) throws java.io.IOException {
        char answer = 'K', ignore,ch='a';
        int i=0;

        while (ch != answer) {
            System.out.println("I am Thinking of a letter between A and Z, can you guess it?");
            ch = (char) System.in.read();
            i++;
            if (ch !=answer) {
                System.out.println("Wrong ! please try again");
             }
             else{
                System.out.println("Correct!, you guessed after "+i+" attempts");
                break;
             }

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