Программа монет с переворотом - PullRequest
0 голосов
/ 27 января 2020

Я только начинаю Java, и это программа для монет, которую я недавно написал. Таким образом, предполагается производить последовательности бросков монет, которые отвечают требованиям, которые пользователь устанавливает, однако, когда он достигает конца, он должен спросить, хочет ли пользователь снова go. У меня возникла проблема, когда он напечатает вопрос дважды, когда он закончится. Мне действительно нужно выяснить это, поэтому любые предложения / разъяснения для моего кода будут с благодарностью.

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

    outer: while (true) {
        System.out.print("Ready to run a coin flip simulation. Enter the number of sequences: ");
        int sequences = scan.nextInt();

        System.out.print("How many heads should each sequence have? ");
        int heads = scan.nextInt();

        System.out.print("How many tails should each sequence have? ");
        int tails = scan.nextInt();

        System.out.println("Simulating Sequences");

        int tFlips = 0;
        int mFlips = 0;

        for (int i = 1; i <= sequences; i++) {
            int h = 0;
            int t = 0;
            String s = "";
            while (t < tails || h < heads) {
                if (Math.random() < 0.5) {
                    h++;
                    s += "H";
                } else {
                    t++;
                    s += "T";
                }
                tFlips++;
            }

            if (t + h > mFlips) {
                mFlips = t + h;
            }

            System.out.println(i + " - " + s);
            h = 0;
            t = 0;
            s = "";

        }
        System.out.printf("The average number of flips was " + ((float) tFlips / sequences) + " and maximum was %d", mFlips);

        System.out.println("\r\n");

        boolean go = true;

        while (go) {
            System.out.print("Would you like to run another simulation? (y/n): ");
            String c = scan.nextLine();

            if (c.equalsIgnoreCase("y")) {
                break;
            } else if (c.equalsIgnoreCase("n")) {
                break outer;
            } else {
                continue;
            }
        }
        System.out.print("\r\n");
    }
}

Ответы [ 2 ]

1 голос
/ 27 января 2020

Ваш String c = scan.nextLine(); читает новую строку из ваших scan.nextInt() вызовов. Вы можете прочитать больше здесь Сканер пропускает nextLine () после использования next () или nextFoo ()?

Хорошей практикой является вызов .nextLine() после каждого вызова .nextInt() для всегда использовать символ новой строки.

0 голосов
/ 27 января 2020

Измените String c = scan.nextLine(); на String c = scan.next();. И вам на самом деле не нужны while(go) l oop, проще, если вы делаете это:

System.out.print("Would you like to run another simulation? (y/n): ");
String c = scan.next();
if (!c.equalsIgnoreCase("y"))
   break;

PS: здесь хороший ответ, почему nextLine() не работает правильно. (@Rohit Jain)

...