2017-10-25 12 views
0

Also für meine cs-Klasse musste ich ein Programm schreiben. Lange Rede, kurzer Sinn, ich schicke es an einen Autograder, der Feedback gibt. Der Autograder gibt Hinweise, wenn wir nicht alle Tests bestehen. Einer der Hinweise war, dass mein Code anscheinend für einige Testfälle in eine Endlosschleife zu gehen schien, aber ich weiß nicht, wo dies in meinem Code möglicherweise passieren könnte. Kann mir jemand in die richtige Richtung zeigen, wo ich vielleicht falsch liege? Ich werde meinen Code unten liefern:Ich weiß nicht, wo die Endlosschleife

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


} 
} 

Antwort

1

Der Weg, den ich als potentiellen Endlosschleife abgeholt durch ein automatisiertes Werkzeug sehen kann, ist der Fall, wenn der Benutzer immer das Terminal Wert eingeben hält.

0

Ein Problem, das ich mit dem Code sehen, den Sie zur Verfügung gestellt haben, ist der Vergleich von Doubles mit ==. Wenn Sie equals verwenden, können Sie das Terminal möglicherweise nie sehen.

Sie werden wahrscheinlich die Gleichen, so etwas ändern mögen: Math.abs(temp - termValue) < 1e-6

Ein weiteres Szenario, das in einer Endlosschleife führen könnte, ist, wenn das Terminal ist NaN, weil NaN = NaN!.

Auch als Referenz: Test for floating point equality. (FE_FLOATING_POINT_EQUALITY)

+0

warum sollte ich den Endwert nicht sehen, ob ich == verwendet. Haben Sie bis jetzt == verwendet und sind keine Probleme aufgetreten? – warriors31

+0

Rundungsfehler in Gleitkommazahldarstellungen. Der Link, den ich als Referenz angegeben habe, erklärt ein wenig mehr. –

Verwandte Themen