2016-09-11 2 views
-3

In diesem Codeabschnitt, in Zeile 13, habe ich correctAnswers um 1 inkrementiert. Sobald die if-Anweisung jedoch abgebrochen wurde, ist der Wert nur eins (oder null), wenn der Prozentsatz ausgegeben wird . Kann mir jemand sagen, was mit meinem Code nicht stimmt?Variabler Wert anders außerhalb der if-Anweisung

private static void multiplicationTest(int maxNumber, int minNumber) { 
    int i = 1;               

    while(i != 11) {              
     int firstNumber = (minNumber + (int)(Math.random() * ((maxNumber - minNumber) + 1))), secondNumber = (minNumber + (int)(Math.random() * ((maxNumber - minNumber) + 1))); 
     int inputAnswer, answer = (firstNumber * secondNumber); 
     int correctAnswers = 0; 

     System.out.print("Question " + i + ".)\t" + firstNumber + " * " + secondNumber + " = "); 
     inputAnswer = input.nextInt(); 

     if(inputAnswer == answer) { 
      correctAnswers++; 
      System.out.print("\tcorrect\n"); 

     } else { 
      System.out.print("\tincorrect --- " + firstNumber + " * " + secondNumber + " = " + answer + "\n"); 

     } if(i == 10) { 
      System.out.println("\nYou scored " + correctAnswers + " out of 10 - " + (correctAnswers * 10) + "%."); 

     } 

     i++; 
    } 

} 
+1

* "Sobald die if-Anweisung jedoch gebrochen ist ..." * Was bedeutet das? –

+6

Am Ende gibt es auch ein * sehr * irreführendes Bracing:}} if (i == 10) {'Beginne das' if' in einer eigenen Zeile. –

+2

Sie iterieren 10 mal. Bei jeder Iteration setzen Sie 'correctAnswers = 0'. Wie erwartest du, dass es die Gesamtanzahl über alle 10 Iterationen hinweg speichert, wenn du es immer auf 0 zurückstellst? – Andreas

Antwort

2

Platz int correctAnswers = 0; vor der while Linie.

Wenn es in der While-Schleife ist, wird es die Gesamtpunktzahl bei jedem Lauf zurückgesetzt.

Das bedeutet, die Gäste wirklich jedes Mal aus einer ist, nicht 10.

0

UserF40 Ihre Fehler hingewiesen hat. Für den Rest werde ich einen kurzen Code-Review machen.

  1. Sie verwenden eine while Schleife von 1 bis 10 zu zählen, ist es viel einfacher, eine for Schleife zu verwenden, das zu tun: for (int i = 1; i < 11; ++i). Verwenden Sie eine while-Schleife, wenn eine nicht-numerische boolesche Bedingung zum Beenden der Schleife vorliegt.

  2. Ihre zweite if ist verlegt, und kann weggelassen werden. Da nur beim letzten Durchlauf der Schleife eine Aktion ausgeführt wird, können Sie die Aktion nach dem Beenden der Schleife einfügen, ohne dass if erforderlich ist.

  3. Lernen Sie die Java-Bibliotheken. Sie Math.random() ist gut für reelle Zahlen, aber nicht gut für ganze Zahlen. Für zufällige Ganzzahlen verwenden Sie Random.nextInt(), die Integer direkt liefert.

  4. Vermeiden Sie mehrere Deklarationen in einer Zeile, es ist unnötig und kann verwirrend sein. Eine Deklaration pro Zeile ist klarer.

+0

Danke. Auf Nummer drei verwende ich 'Math.random()', weil ich diese Zeile gelernt habe, um zufällige ganze Zahlen innerhalb eines Bereichs zu machen. Wenn es eine ähnliche Zeile mit 'Random.nextInt()' gibt, ist es gleich oder anders? –

+0

'Random.nextInt (int boundary)' gibt Ihnen eine zufällige ganze Zahl von 0 (einschließlich) bis Grenze (exklusiv). Für Ihren Code sieht das etwa so aus: 'firstNumber = minNumber + Random.nextInt (maxNumber - minNumber +1);' Mein "+ 1" geht davon aus, dass maxNumber im Bereich der produzierten Zahlen enthalten ist. Dies ist in der [Java-Dokumentation] (http://docs.oracle.com/javase/8/docs/api/index.html) dokumentiert. – rossum

Verwandte Themen