Erste Schritte Frage eines absoluten Anfängers

Doriann

Neues Mitglied
Guten Tag zusammen,

ich versuche gerade folgende Aufgabenstellung zu lösen:

Vorgegeben ist das Programm SchuelerRechentest.java, das zwei Zufallszahlen generiert. Ergänzen Sie es so, dass daraus ein kleines Testprogramm für die Rechenfähigkeiten eines Grundschülers wird.
  • Lesen Sie die Eingabe des Schülers ein.
  • Vergleichen Sie beide miteinander.

mein Code:

Java:
import java.util.Scanner;

public class SchuelerRechentest {
   
    public static void main(String[] args) {
       
        Scanner tastatur = new Scanner(System.in);

        // Zwei Zufallszahlen zwischen 0 und 10 mit einer Nachkommastelle generieren
        double a = Math.round(Math.random() * 100) / 10.0;
        double b = Math.round(Math.random() * 100) / 10.0;
        double summe = a + b;

        System.out.print(a + " + " + b + " = ");
        System.out.println("Wie ist das Ergebnis?");
       
        // Eingabe des Ergebnisses durch den Benutzer
        double summeSchueler = tastatur.nextDouble();

        // Überprüfung, ob das eingegebene Ergebnis korrekt ist
        boolean richtigesErgebnis = summe == summeSchueler;

        // Ergebnis ausgeben
        System.out.println("Ist das Ergebnis richtig? " + richtigesErgebnis);

    }
}

Wenn ich die gefragte Kommazahl mit einem "." angebe bekommen ich einige Exceptions als Fehlermeldung.
Wenn ich sie mit einem "," angebe bricht das Programm ab und die letzte Ausgabe wird nicht angezeigt.

Ich hatte ursprünglich beim Scanner noch den Delimiter. Da ich gelesen hatte, dass dieser bei Double zu Problemen führen kann hab ich die Zeile gelöscht.

Über Hilfe würde ich mich sehr freuen, da ich mitlerweile 2 Stunden versuche das Problem zu finden.

Schöne Grüße

Dorian
 
Zuletzt bearbeitet von einem Moderator:
Hier wäre erst einmal wichtig, dass Du immer die Details mitteilst. Also wenn Du Exceptions bekommst, dann solltest Du diese auch zeigen.

Bezüglich des Codes sehe ich zwei Punkte:

a) Das Format. Wie Zahlen formatiert werden, hängt von den Regionalen Einstellung ab. Wie nutzen in Deutschland das , aber England, USA und co nutzen z.B. den Punkt. Scanner sollte die lokalen Einstellungen nutzen, daher sollten die Zahlen mit Komma eingegeben werden (So du Deutschland als Region eingestellt hast).
Das könntest Du aber auch setzen, aber die Frage ist, ob das sinnvoll ist. Es ist halt unschön, dass Du derzeit bei der Anzeige die Einstellung nicht hast (also den . hast) aber bei der Eingabe wird es berücksichtigt.

Die Anzeige könnte man anpassen mit NumberFormat aber für die Aufgabe ist das erst einmal nicht releant.

b) Vergleich von double Zahlen
double Zahlen sind ja im dualen System gespeichert aber Du gibst Zahlen im dezimalen System an. Das führt schon zu Ungenauigkeiten. Das kann zu Fehlern führen. Ich habe einfach einmal den Code ergänzt um die Ausgabe von summe und summeSchueler und folgende Ausgabe erzeugt:
Code:
3.7 + 3.6 = Wie ist das Ergebnis?
7,3
7.300000000000001
7.3
Ist das Ergebnis richtig? false

Du erkennst also neben der Aufgabe meine Eingabe (mit einem Komma, da Deutsche Einstellungen)
Dann kommt die berechnete Summe ... und die weicht tatsächlich ab.
Die Eingabe noch einmal - die ist also richtig aufgenommen worden.
Und dann ist das Ergebnis natürlich falsch.

Double Zahlen vergleicht man also über die Differenz - die muss unter einer gewissen Schwelle sein.
Also ist erst einmal die Frage, was für eine Abweichung wir akzeptieren können. Das nennt man oft epsilon und das könnten wir auf 0.00001 setzen oder so. Die Prüfung wäre dann statt dem Vergleich mit == ein:
Math.abs(summe - summeSchueler) < epsilon

Ich hoffe, auf die Schnell reicht diese Erläuterung erst einmal aus. Wenn wir etwas vertiefen sollen, dann sag einfach Bescheid.
 
// Zwei Zufallszahlen zwischen 0 und 10 mit einer Nachkommastelle generieren
Bevor ich hier im Beispiel mit double hantiere, würde ich ganze Zufallszahlen (int) zwischen 0..100 verwenden und erst bei der Ausgabe des Ergebnisses durch 10 teilen. Die Eingabe würde ich ebenfalls in int umwandeln nachdem sie mit 10 multipliziert wurde. Somit wäre auch ein Vergleich mit == möglich.
 
Vielen Dank für die ausführlichen Antworten. Ich werde den Code später dementsprechend anpassen und gebe dann nochmal eine Rückmeldung.

Ich hatte mir natürlich die Forenregeln erst im Anschluss des Posts durchgelesen. Bei meinen nächsten Beiträgen werde ich die Vorgaben beachten.
 

Zurück
Oben