2017-12-09 8 views
-1

Ich versuche herauszufinden, warum, wenn ich meine Werte von 4 & 2 zu etwas wie 4 & 3 ändern, berechnet es nicht die Durchschnitte richtig.Wie würde ich meinen eigenen Testfall erstellen, um herauszufinden, warum dieser Code die Hälfte der Zeit die richtige Antwort liefert?

Ich möchte 2 Dinge wissen.

Wie man einen Testfall für etwas so einfaches wie dieses ausführt, und wie man meinen Code repariert, wo es jedes Mal zwei Zahlen richtig austeilt.

using System; 

public class MathUtils 
{ 
    public static double Average(int a, int b) 
    { 
     return (a + b)/2; 
    } 

    public static void Main(string[] args) 
    { 
     Console.WriteLine(Average(4, 2)); 
    } 
} 

// right now returns 3 which is correct 
+0

Ist das echtes Leben oder Hausaufgaben? – Charleh

+0

Sie addieren zwei ganze Zahlen und dividieren durch eine dritte ganze Zahl (das Literal '2'). Die Art, wie am stärksten typisierte Programmiersprachen arbeiten, bedeutet, dass dies unter Verwendung von Ganzzahlarithmetik durchgeführt wird. –

+0

Wie möchten Sie es testen? Mit welchem ​​Unit-Testing-Framework? Ist die visuelle Studioeinheit in Ordnung? – CodingYoshi

Antwort

1

Ändern Sie es an:

public static double Average(int a, int b) 
{ 
    return (a + b)/2.0; // will be incorrect for edge case with int-overflow - see Edit 
} 

Grund: Wenn Sie zwei Zahlen addieren, erhalten Sie eine ganze Zahl ist. Wenn Sie eine ganze Zahl durch eine ganze Zahl teilen, erhalten Sie standardmäßig eine andere ganze Zahl - kein Float oder Double. Die Teile nach dem . werden verworfen.


Edit: Wie Hans Passant wies darauf hin, können Sie einen Überlauffehler bekommen, falls beide Ints mehr als ein int aufaddieren verarbeiten kann - so (zumindest einer) Gießen ihnen ist die intelligentere zu verdoppeln bewegen

return ((double)a + b)/2; // .0 no longer needed. 

Sie müssen einige nicht-Zahlen in der Mischung zu erhalten, wie gut das .xxxx Teil zu bekommen.

Wie für den Testfall - das hängt von der Testumgebung ab, die Sie verwenden. Sie sollten wahrscheinlich betrachten Testfälle von (int.MinValue, int.Minvalue), (int.MaxValue, int.MaxValue) und einige einfache diejenigen (0,0), (1,1), (1,2)

Wie Sie die Fehler erkennen: eine C# Erfahrung bekommen - oder Zwischenvariablen und Haltepunkte verwenden und ein Debugger, um zu sehen, was wo falsch läuft.

Dieses hier:

public static double Average(int a, int b) 
{ 
    var summed = a + b; 
    var avg = summed/2; 

    return avg; 
} 

in Debuggen würde ziemlich schnell den Fehler hinweisen.

+0

Durchschnitt (int.MaxValue, 1) –

Verwandte Themen