"Почему моя лотерея игнорирует нули?" - PullRequest
0 голосов
/ 20 октября 2019

Я выполняю упражнение 3 из главы 4 книги «Введение в Java» Уолтера Савича. Инструкции: Разработайте алгоритм простой игры в угадывание по секретному пятизначному коду. Когда пользователь вводит предположение в коде, программа возвращает два значения: количество цифр в предположении, которые находятся в правильной позиции, и сумму этих цифр. Например, если секретный код os 53840 и пользователь угадывают 83241, цифры 3 и 4 находятся в правильном положении. Таким образом, программа должна ответить 2 и 7. Разрешить пользователю угадывать фиксированное число раз

Текущие проблемы:

  • мой код выглядит грязным и слишком длинным. Я новичок, но ищу способы сделать его более эффективным
  • при вводе «числа догадки», которое начинается с любого другого числа, кроме 0, но работает, но когда оно начинается с 0, моя программа игнорирует первыйцифра

Я потратил на это два часа. В этой главе меня ждут еще 25 упражнений, поэтому я надеюсь быть более эффективными с другими упражнениями.

 public static void main(String[] args) {
        int SecretCode = 12140;
        int Win = 0;
        //just checking the incrementor
        int sum = 0;
        System.out.println("Ceci est un jeu de lotterie. \nPouvez-vous deviner le nombre à 5 chiffres caché ?\n");

        Scanner fromPlayer = new Scanner(System.in);
        do {
            System.out.println("Votre nombre porte-bonheur: ");
            int guess = fromPlayer.nextInt();
            //Interprets Guess int to string
            String stringGuess = String.valueOf(guess);
            int length = stringGuess.length();

            boolean CorrectLength = (length == 5);
            if (CorrectLength) {

                String Firstdigit = stringGuess.substring(0, 1);
                String Seconddigit = stringGuess.substring(1, 2);
                String Thirddigit = stringGuess.substring(2, 3);
                String Fourthdigit = stringGuess.substring(3, 4);
                String Fifthdigit = stringGuess.substring(4);

                //Interprets Secret Code int to string
                String stringSecretCode = String.valueOf(SecretCode);
                String FirstdigitCode = stringSecretCode.substring(0, 1);
                String SeconddigitCode = stringSecretCode.substring(1, 2);
                String ThirddigitCode = stringSecretCode.substring(2, 3);
                String FourthdigitCode = stringSecretCode.substring(3, 4);
                String FifthdigitCode = stringSecretCode.substring(4);

                //Just checking the values that the program will compare to secret code
                System.out.println("Vous avez entré \n" + Firstdigit + "\n" + Seconddigit + "\n" + Thirddigit + "\n" + Fourthdigit + "\n" + Fifthdigit);

                if (Firstdigit.equals(FirstdigitCode)) {
                    Win = Win + 1;
                    sum = sum + Integer.parseInt(Firstdigit);
                    System.out.println("Premier numéro est : correct. Score: " + Win);
                } else {
                    System.out.println("Premier numéro est : incorrect. Score:" + Win);

                }
                if (Seconddigit.equals(SeconddigitCode)) {
                    Win = Win + 1;
                    sum = sum + Integer.parseInt(Seconddigit);
                    System.out.println("Deuxième numéro est : correct. Score: " + Win);

                } else {
                    System.out.println("Deuxième numéro est : incorrect. Score: " + Win);

                }

                if (Thirddigit.equals(ThirddigitCode)) {
                    Win = Win + 1;
                    sum = sum + Integer.parseInt(Thirddigit);
                    System.out.println("Troisième numéro est : correct. Score: " + Win);

                } else {
                    System.out.println("Troisième numéro est : incorrect. Score: " + Win);

                }
                if (Fourthdigit.equals(FourthdigitCode)) {
                    Win = Win + 1;
                    sum = sum + Integer.parseInt(Fourthdigit);
                    System.out.println("Quatrième numéro est : correct. Score: " + Win);

                } else {
                    System.out.println("Quatrième numéro est : incorrect.  Score: " + Win);

                }
                if (Fifthdigit.equals(FifthdigitCode)) {
                    Win = Win + 1;
                    sum = sum + Integer.parseInt(Fifthdigit);
                    System.out.println("Cinquième numéro est : correct. Score: " + Win);

                } else {
                    System.out.println("Cinquième numéro est : incorrect.  Score: " + Win);

                }
                System.out.println("Vous avez deviné " + Win + " numéros. Leur total vaut " + sum);

            } else {
                System.out.println("ERREUR. Il faut entrer 5 chiffres.");
            }

Я ожидаю, что результат 02140 будет "Premier numéro est: неверный. Оценка: 0 Deuxième numéro est: правильный. Оценка: 1 Troisième numéro est: правильный. Оценка: 2 Quatrième numéro est: правильныйОценка: 3 Cinquième numéro est: правильно. Оценка: 4 Vous avez deviné 4 numéros. Leur total vaut 7 "

НО фактический результат: ERREUR. Il faut entrer 5 шифер. как будто программа не идентифицирует 0 как цифру.

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Вместо использования

String stringGuess = String.valueOf(guess);

вы должны использовать

String stringGuess = String.format("%05d", guess);

, чтобы всегда преобразовывать прочитанное число в пятизначную длину String. В вашем текущем решении вы должны увидеть, что если вы напечатаете stringGuess, начальные нули будут удалены из ввода.

Вместо этого вы можете использовать следующий код, который использует nextLine() метод Scannerкласс для решения вашей проблемы:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    char[] expected = "53849".toCharArray();

    // enter CTRL-D to stop
    while (scanner.hasNext()) {
        String input = scanner.nextLine();

        if (input.length() != 5) {
            System.err.println("wrong length");
            continue;
        }

        char[] actual = input.toCharArray();

        int digitSum = 0;
        int correctDigits = 0;

        for (int i = 0; i < expected.length; i++) {
            if (actual[i] == expected[i]) {
                correctDigits++;
                digitSum += actual[i] - '0';
            }
        }

        String msg = String.format(
                "Number of correct digits: %d, their sum: %d",
                correctDigits, digitSum
        );
        System.out.println(msg);
    }
0 голосов
/ 21 октября 2019

Попробуйте приведенную ниже и посмотрите, работает ли она для вас. Возьмите ввод непосредственно в stringGuess вместо того, чтобы принять его в int и затем преобразовать в String.

int guess = fromPlayer.nextInt(); //remove this and take input into the below variable directly
String stringGuess = fromPlayer.next();

Проверьте это для справки, почему int не может хранить начальные нули .

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