C# Programmieren?
Hey Leute, ich verstehe nicht wieso diese Methode nicht funktioniert.
Zähler und Nenner = 3/4 other Zähler und Nenner= 6/8
3 % 6 = 3 4 % 8 = 4
was ist den funktioniert nicht ? eine aussage ist unter programmierern keine problem beschreibung , funktioniert nicht sagt nur , das du eine frage hier stellen wirst .
Ich muss eine Methode erstellen, die nach kürzen einer Bruch, die Nenner und Zahler gleich wie die zweite Bruch sein soll. Aber leider wird mein Unittest nicht bestanden.
und eine fehlerbeschreibung , was erwartest du, was passiert nicht .
Ja Unittests spucken entweder ( Bestanden✔ oder Fehler❌..)
Und ich verstehe nicht, was in meine Methode falsch sein kann.
1 Antwort
Wenn ich dein Code ausführe, erhalte ich bei mir ein true zurück (dotnet 6.0.402 unter MacOS ARM64). Statt Assert.IsTrue habe ich ein einfaches Console.WriteLine benutzt.
Auch wenn sie in diesem expliziten Fall funktioniert, ist es kein guter Weg um Brüche zu vergleichen. So ist z.B. folgendes der Fall:
fraction.IsEqual(other); // True
other.IsEqual(fraction); // False
Nur weil die Reihenfolge umgekehrt ist, haben die Brüche kein unterschiedlichen Wert.
Das einfachste Weg zum Vergleichen von zwei Brüchen ist über das Kreuprodukt.
public bool IsEqual(Fraction other)
{
return Numerator * other.Denominator == Denominator * other.Numerator;
}
Es ist auch keine gute Idee in einer Equals Funktion den Wert von einer Variable zu verändern. other.Numerator sollte nach dem IsEquals noch den gleichen Wert haben. Du solltest stattdessen eine lokale Variable für das Ergebnis anlegen.
Falls du mehrere IsEquals mit dem identischen fraction und other Objekt ausführst, könnte daher dein fehlgeschlagenener Test kommen.
Das Kürzen von Brüchen geht auch etwas anders als sich den Remainder (% Operator) zu schnappen. Mit Implementierung in C++ gibt es hier ein Beispiel zum Kürzen von Brüchen.
Auch wenn du den ersten Bruch richtig kürzst und jeweils den Numerator und Denominator vergleichst, kann ein False zurückkommen, obwohl beide Brüche den gleichen Wert haben. Beispiel:
Bruch 1: 12/16 -> 3/4
Bruch 2: 6/8 (ohne Kürzen)
Numerator * other.Denominator == Denominator * other.Numerator // False
Wenn du einen Bruch kürzst und den anderen nicht und die Brüche etwas speziell vergleichst, sollte deine Methode auch nicht "IsEqual" heißen, sondern einen anderen Namen bekommen.
Warum dein ursprüngliche Lösung nicht funktioniert, solltest du mit dem Debugger lösen. Welchen Werte haben deine Objekte in der "IsEqual" Funktion? Entsprechen sie deiner Erwartung?