【问题标题】:Infinite loop trouble in JavaJava中的无限循环问题
【发布时间】:2012-02-19 23:26:12
【问题描述】:

当我在这段代码的底部运行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;
        }

【问题讨论】:

  • 如果您不展示 predictPopulation() 所做的事情,这是不可能回答的问题。
  • 这无法回答,因为您还没有显示predictPopulation() 的定义。只能说很明显input2.predictPopulation(i)永远不会超过input1.predictPopulation(i)。
  • 对不起,伙计们,我在发布这个时走神了。 predictPopulation() 现在在那里
  • 我建议你在调试器中单步调试你的程序,看看发生了什么。

标签: java for-loop infinite-loop


【解决方案1】:

这个:

        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 指出如果您使用&lt;= 而不是&lt;,您将不会遇到无限循环——但这是您需要解决的问题。)

【讨论】:

  • 另外 if ((input1.predictPopulation(1) - input2.predictPopulation(1))
  • @Dampsquid:很好,谢谢。我已将其添加到答案中。
  • @Dampsquid:实际上,再三考虑。 . .它比这更复杂。当前的测试通常是错误的,不仅仅是因为使用&lt; 而不是&lt;=。如果input1 一开始人口非常少,那么它可能一开始似乎增长更慢(因为增长与人口成正比),但最终仍会超过input2(因为从长远来看,growthRate 越大)。
  • 你确定吗?因为人口每年都在增加。
  • @ruakh:嗯,非常正确,这个作业需要更多的思考,很高兴它不是我的(幸好几十年前完成了作业)
【解决方案2】:

你的问题在这里

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

input1 的数量永远不会少于 input2,这与以下情况之一有关:

  1. input1 获取的参数值不允许其“人口”变得小于 input2(检查输入范围以确保发生这种情况,可能类似于确保 input2 的增长率大于 input1)

  2. 类本身有问题,迫使 input1 始终等于或大于 input2。

编辑:因为您已经发布了 predictPopulation 的代码,所以它看起来是第一名。确保 input2 的增长率始终大于 input1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2014-09-03
    • 2021-09-02
    相关资源
    最近更新 更多