2017-10-25 9 views
0

私のクラスでは、プログラムを書く必要がありました。長い話を簡単に言えば、私はそれをフィードバックを提供するオートグラベーターに提出します。すべてのテストに合格しなければ、自動採点はヒントを提供します。ヒントの1つは、私のコードがいくつかのテストケースのために無限ループになっているように見えたが、どこでこれが起こる可能性があるのか​​わからない。誰かが私が間違っているかもしれないところへ正しい方向に向けることができますか?無限ループがどこにあるのか分かりません

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); 


} 
} 

答えて

1

潜在的な無限ループは、ユーザが永遠の端末値を入力し続ける場合のように、私は自動化ツールによってピックアップされて見ることができますパス:私は以下の私のコードを提供します。

0

私が提供したコードで見られる1つの問題は、==を使った2倍の比較です。 equalsを使用すると、端末が表示されないことがあります。 !

あなたは、おそらくこのような何かに等号を変更したいと思う:ターミナルがNaN = NaNのため、NaNの場合は、無限ループにつながる可能性が Math.abs(temp - termValue) < 1e-6

もう一つのシナリオがあります。参照のためにも

、:私は==を使用した場合Test for floating point equality. (FE_FLOATING_POINT_EQUALITY)

+0

なぜ私はターミナル値は表示されません。今まで==を使用していて問題が発生していない場合は? – warriors31

+0

浮動小数点数表現における丸め誤差。私が参考文献として提供したリンクはもう少し説明します。 –

関連する問題