Есть ли способ убедиться, что l oop не запускается один раз перед запросом ввода? - PullRequest
0 голосов
/ 29 января 2020

Я пишу программу броска монеты. В основном, пользователя спрашивают, сколько игр они хотят играть. Затем, пока l oop запускает игру, которая просит пользователя ввести несколько бросков монет, разделенных пробелами (головы или хвосты, например, HHHTH). Затем программа преобразует пользовательскую строку ввода в массив, и for l oop проходит через массив и проверяет заголовки (заглавная H), и она сохраняется в переменнойглав. Оценка рассчитывается путем умножения количества головок в массиве на длину массива и умножения его на 100, чтобы получить процент. Если счет 50% или выше, игрок выигрывает. Если ниже 50%, игрок проигрывает. Я обнаружил две ошибки: l oop уже работает один раз, прежде чем вводить какие-либо данные. Кроме того, оценка, кажется, рассчитывается неправильно, где она всегда возвращает 0,0% или 100,0%. Я думаю, что это как-то связано с inputArray.length, но я не могу сказать. Спасибо.

import java.util.Scanner;
public class HeadTailGenerator {

public static void main (String []args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("How many games?");
    int games = scanner.nextInt();
    int count = 0;
    int heads =0;

    while (count<games){
        System.out.print("Enter your flips for game "+ count+": ");
        String input = scanner.nextLine();
        String [] inputArray = input.split("\\s+");
        for (int i = 0; i <inputArray.length-1; i++){

            if (inputArray[i].equals("H")){
                heads++;
            }

        }//exit for loop

        double score = (heads/(inputArray.length)*100);

        if (score >= 50.0){
            System.out.println("Game "+ count + ": "+ heads + " heads ("+ score+ "%); You win!");
        }
        else {
            System.out.println("Game "+ count + ": "+ heads + " heads ("+ score+ "%); You lose!");
        }

        count++;
    }
}
}

Ответы [ 2 ]

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

Добавление нескольких отпечатков поможет вам отладить все проблемы.

Первая проблема заключается в том, что nextInt() не захватывает разрыв строки, используемый для ввода количества игр, поэтому вы можете добавить scanner.nextLine(); после этого, чтобы предотвратить немедленное завершение игры.

Вторая проблема - это ваше условие для l oop. Удалите от -1 до l oop по всем элементам в массиве.

Третья проблема состоит в том, что при вычислении для получения результата вы делите целое число на число, которое всегда больше или равно до этого целого числа, так что десятичные дроби усекаются, или результат равен 1. Вы можете привести целое число к удвоению в операции или объявить heads как двойное, или, альтернативно, вы можете умножить на 100 перед делением, если вас не волнует десятичные дроби процента результата.

import java.util.Scanner;
public class Main {
    public static void main (String []args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("How many games? ");
        int games = scanner.nextInt();
        System.out.println("Games: "+ games);
        scanner.nextLine();
        int count = 0;
        int heads = 0;

        while (count<games){
            System.out.print("Enter your flips for game "+ count+": ");
            String input = scanner.nextLine();
            String [] inputArray = input.split("\\s+");
            for (int i = 0; i <inputArray.length; i++){
                System.out.println("Input["+ i +"]: "+ inputArray[i]);
                if (inputArray[i].equals("H")){
                    heads++;
                    System.out.println("Heads count: "+ heads);
                }

            }//exit for loop

            double score = ((double)heads/(inputArray.length)*100);

            if (score >= 50.0)
                System.out.println("Game "+ count + ": "+ heads + " heads ("+ score+ "%); You win!");
            else 
                System.out.println("Game "+ count + ": "+ heads + " heads ("+ score+ "%); You lose!");

            count++;
        }
    }
}
0 голосов
/ 29 января 2020

Я столкнулся с этим не слишком долго go. Первая проблема, почему хотя l oop запускается один раз, прежде чем принимать ввод от пользователя, заключается в том, как сканер обрабатывает чтение nextInt(). Сканер только что прочитал следующее целочисленное значение, к которому он пришел, но не дошел до конца строки. Поэтому, когда вы вызываете scanner.nextLine() изнутри, когда l oop, это на самом деле просто чтение конца первой строки ввода, и именно поэтому вы получаете нули там.

Вторая проблема, всегда получая ноль , имеет отношение к типу данных, которые вы используете. Помните, int / int = int. Итак, когда вы делите 3/4 = 0, потому что int усекается. Неважно, что вы храните в двойном, это целочисленное деление делает это неправильно. Если вы просто поменяете головки на плавающие, это исправит это.

Подробнее о сканере можно узнать здесь.

...