Hallo!
Wir machen gerade in der Schule eine Übung zum Thema Schleifen, und sollen einen "Rechenautomat" erstellen.
Mit Int32 funktioniert es ohne Probleme, aber wenn man die Zufallszahlen als Double erstellen lässt, kommt es doch öfters vor, dass das Ergebnis angeblich falsch sei.
Die Lösung des Programms kam so vom Lehrer, ich habe nur etwas mehr WriteLines eingefügt um die Ausgabe genauer zu sehen.
Meine Frage ist nun, was genau in dem Code diesen "Fehler" verursacht. Ist es die Art und Weise wie die Zufallszahlen erstellt werden? Oder die "Runden"-Funktion? Oder doch etwas anderes?
Und mich würde interessieren, wie man es richtig macht mit Double.
Vielen Dank schon mal für die Hilfe.
Hier noch der Code:
Wir machen gerade in der Schule eine Übung zum Thema Schleifen, und sollen einen "Rechenautomat" erstellen.
Mit Int32 funktioniert es ohne Probleme, aber wenn man die Zufallszahlen als Double erstellen lässt, kommt es doch öfters vor, dass das Ergebnis angeblich falsch sei.
Die Lösung des Programms kam so vom Lehrer, ich habe nur etwas mehr WriteLines eingefügt um die Ausgabe genauer zu sehen.
Meine Frage ist nun, was genau in dem Code diesen "Fehler" verursacht. Ist es die Art und Weise wie die Zufallszahlen erstellt werden? Oder die "Runden"-Funktion? Oder doch etwas anderes?
Und mich würde interessieren, wie man es richtig macht mit Double.
Vielen Dank schon mal für die Hilfe.
Hier noch der Code:
VB.NET-Quellcode
- Option Strict On
- Imports System.Console
- ' Es wird eine zufällige Rechenaufgabe gestellt.
- ' Der Benutzer muss das richtige Ergebnis eingeben.
- ' Die Aufgabe wird solange wiederholt, bis das Ergebnis stimmt
- Module Module1
- Sub Main()
- Do
- Rechenautomat(2, 10) ' Ruft die Aufgabe in den Grenzen 1-10 auf
- WriteLine("Möchtest Du noch eine Aufgabe lösen (j/n)?")
- Loop Until ReadKey(True).Key = ConsoleKey.N ' (True) bewirkt, dass Zeichen nicht angezeigt wird
- WriteLine("Dann einen schönen {0} noch.", Now.ToString("dddd"))
- ReadKey()
- End Sub
- Sub Rechenautomat(Untergrenze As Double, Obergrenze As Double)
- Dim sEin As String ' Für die Eingabe des Benutzers
- Dim iEin As Double ' Die Eingabe nach Double gewandelt
- Dim iA, iB, iErg As Double ' Summanden der Aufgabe und Ergebnis
- Dim ZufallObj As New Random ' Objekt zum Erzeugen von Zufallszahlen
- ' Zufällige Summanden im Bereich 1-10 bestimmen
- iA = 1 + 11 * ZufallObj.NextDouble
- WriteLine(iA)
- iA = Math.Round(iA, 1)
- WriteLine(iA)
- iB = 1 + 11 * ZufallObj.NextDouble
- WriteLine(iB)
- iB = Math.Round(iB, 1)
- WriteLine(iB)
- iErg = iA + iB ' Ergebnis berechnen
- WriteLine(iErg)
- 'Console.Clear() ' Bildschirm löschen
- WriteLine(iErg)
- WriteLine("Bitte löse folgende Aufgabe!")
- Do
- Write("{0} + {1} = ", iA, iB) ' Aufgabe stellen
- sEin = ReadLine() ' Nicht vergessen, Readline liefert String
- ' Sichere Konvertierung von String nach Int32
- Try
- iEin = Convert.ToDouble(sEin)
- Catch ex As Exception
- WriteLine("Ich verstehe ihre Eingabe nicht.")
- WriteLine("Es wird jetzt mal die 0 angenommen")
- iEin = 0 ' Man hätte den Try-Catch-Teil auch wieder in eine Schleife ...
- End Try
- If iEin = iErg Then
- WriteLine("Super! Du hast die Aufgabe {0}+{1}={2} richtig gelöst.", iA, iB, iErg)
- Else
- WriteLine("Dein Ergebnis {0} ist leider falsch!", iEin)
- WriteLine("Bitte nochmals versuchen!")
- End If
- Loop Until iEin = iErg
- End Sub
- End Module