C# Programmieren?

TechPech1984  05.11.2022, 18:09

was ist den funktioniert nicht ? eine aussage ist unter programmierern keine problem beschreibung , funktioniert nicht sagt nur , das du eine frage hier stellen wirst .

aefragaga 
Fragesteller
 05.11.2022, 18:26

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.

TechPech1984  05.11.2022, 18:29

und eine fehlerbeschreibung , was erwartest du, was passiert nicht .

aefragaga 
Fragesteller
 05.11.2022, 18:31

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?