我不知道无限循环的位置

时间:2017-10-25 01:33:34

标签: java

所以对于我的cs课,我必须编写一个程序。长话短说,我把它提交给提供反馈的自动编程器。如果我们没有通过所有测试,自动编程器会提供提示。其中一个提示是我的代码似乎在一些测试用例中似乎进入了无限循环,但我不知道在我的代码中可能发生的这种情况。有人能指出我正确的方向,我可能会出错吗?我将在下面提供我的代码:

public class TwoLargest {

public static void main(String[] args){

    double largest = Double.NEGATIVE_INFINITY; 
    double secondLargest = Double.NEGATIVE_INFINITY; 
    int numNums = 0; 

    System.out.print("Please enter a terminating value: ");
    double termValue = IO.readDouble(); 

    System.out.println("Please enter your list of numbers: ");

    while(true){
        double temp = IO.readDouble(); 
        numNums++; 

        if((temp == termValue && numNums < 2) || temp == termValue && numNums == 2){
            IO.reportBadInput();
            numNums = 0; 
            System.out.println("Please try again: ");
            continue; 
        }

        if(temp == termValue){
            break; 
        }


        if (temp > largest) { 
            secondLargest = largest; 
            largest = temp; 
        } 

        else if (temp > secondLargest) { 
            secondLargest = temp;
        }

    }

    IO.outputDoubleAnswer(largest);
    IO.outputDoubleAnswer(secondLargest);


}
}

2 个答案:

答案 0 :(得分:1)

我可以看到被自动化工具选取的路径作为潜在的无限循环,用户可以永久地输入终端价值。

答案 1 :(得分:0)

我在您提供的代码中看到的一个问题是使用==对双打进行比较。通过使用equals,您可能永远不会看到终端。

您可能希望将等号更改为以下内容: Math.abs(temp - termValue) < 1e-6

另一种可能导致无限循环的情况是终端是NaN,因为NaN!= NaN。

另外,供参考:Test for floating point equality. (FE_FLOATING_POINT_EQUALITY)