Проблема с бесконечным циклом в Java - PullRequest
0 голосов
/ 20 февраля 2012

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

    import java.util.Scanner;

public class HW2johnson_pp1 {

    public static void main(String args[]) {

        Scanner keyboard = new Scanner(System.in);

        System.out.printf("Please enter the species with the higher" + 
                          " population first\n");
        System.out.printf("Enter the name of your first species ");
        String Species1 = keyboard.nextLine();
        System.out.printf("Enter the species' population: ");
        int Pop1 = keyboard.nextInt();
        System.out.printf("Enter the species' growth rate: ");
        int Growth1 = keyboard.nextInt();

        System.out.printf("Enter the name of your second species: ");
        String Species2 = keyboard.nextLine();
        System.out.printf("Enter the species' population: ");
        int Pop2 = keyboard.nextInt();
        System.out.printf("Enter the species' growth rate: ");
        int Growth2 = keyboard.nextInt();

        if (Pop2 > Pop1) {
            System.out.printf("The first population must be higher. \n");
            System.exit(0);
        }


        Species input1 = new Species();
        input1.name = Species1;
        input1.population = Pop1;
        input1.growthRate = Growth1;

        Species input2 = new Species();
        input2.name = Species2;
        input2.population = Pop2;
        input2.growthRate = Growth2;

        if ((input1.predictPopulation(1) - input2.predictPopulation(1)) <= 
            (input1.predictPopulation(2) - input2.predictPopulation(2))){

            System.out.printf(Species2 + " will never out-populate " + 
                              Species1 + "\n");
        }
        else {

            for (int i = 0; input2.predictPopulation(i) <= 
                            input1.predictPopulation(i); i++) {

                if (input2.predictPopulation(i) == input1.predictPopulation(i)) {
                    System.out.printf(" will out-populate \n");
                }
            }
        }
    }
}

public int predictPopulation(int years)
        {
            int result = 0;
            double populationAmount = population;
            int count = years;
            while ((count > 0) && (populationAmount > 0))
            {
                populationAmount = (populationAmount +
                              (growthRate / 100) * populationAmount);
                count--;
            }
            if (populationAmount > 0)
                result = (int)populationAmount;

            return result;
        }

Ответы [ 2 ]

3 голосов
/ 20 февраля 2012

Это:

        if (Pop2 > Pop1) {
            Species2 = Species1;
            Pop2 = Pop1;
            Growth1 = Growth2;
        }

не имеет смысла.Очевидно, что вы намереваетесь «поменять» значения для двух совокупностей, но вместо этого вы просто сделаете так, чтобы две совокупности были идентичными, так что для любого значения years, predictPopulation(years) будет одинаковым для обоих объектов.


Отредактировано, чтобы добавить: Этот тест:

        if ((input1.predictPopulation(1) - input2.predictPopulation(1)) < 
            (input1.predictPopulation(2) - input2.predictPopulation(2)))

не является верным способом узнать, превзойдет ли вид 2 в конечном итоге вид 1. Если вид 2имеет более высокую пропорциональную скорость роста (growthRate), тогда он в конечном итоге настигнет вид 1, даже если в течение первых нескольких лет он будет иметь более низкую абсолютную скорость роста.(Это только косвенно относится к вашему бесконечному циклу - Dampsquid указывает, что у вас не было бы бесконечного цикла, если бы у вас было <= вместо < - но это проблема, которую вам нужноисправить.)

1 голос
/ 20 февраля 2012

Ваша проблема здесь

    for (int i = 0; input2.predictPopulation(i) <= 
                    input1.predictPopulation(i); i++) {

Население input1 никогда не становится меньше, чем input2, это связано с одним из следующих действий:

  1. input1 получает значение параметра, которое не позволяет его «населению» становиться меньше, чем input2 (проверьте диапазоны входов, чтобы убедиться, что это может произойти, возможно, что-то вроде того, чтобы убедиться, что скорость роста input2> input1)

  2. Что-то не так с самим классом, который заставляет input1 всегда быть равным или превышать input2.

РЕДАКТИРОВАТЬ: так как вы опубликовали код для предсказания населения, похоже, это номер один. Убедитесь, что ваш темп роста для input2 всегда больше, чем input1.

...