Tiernan Watson
Tiernan Watson

Reputation: 313

What is a more efficient way of classifying triangles?

I have been asked (for school) to write a function that is void and outputs what type of triangle the user has entered:

static void typeTri()
{
    if (side1 == side2 && side2 == side3)
    {
        Console.WriteLine("The triangle is equilateral.");
    }
    else if ((side1 == side2 && side2 != side3) || (side1 != side2 && side2 == side3) || (side1 == side3 && side1 != side2))
    {
        Console.WriteLine("The triangle is isoceles.");
    }
    else
    {
        Console.WriteLine("The triangle is scalene.");
    }
}

The testing seems a bit long on the 'else if'. Any ideas?

Upvotes: 2

Views: 1023

Answers (4)

displayName
displayName

Reputation: 14379

Code it the way you would speak it...

If all sides are equal, 'The triangle is equilateral' otherwise, if at least two sides are equal, 'The triangle is Isosceles' else, 'The triangle is scalene'.

The typeTri() method written below can be spoken like the sentence above.

static void typeTri()
{
    if (AllSidesAreEqual(side1, side2, side3))
    {
        Console.WriteLine("The triangle is equilateral.");
    }
    else if (AtLeastTwoSideAreEqual(side1, side2, side3))
    {
        Console.WriteLine("The triangle is isoceles.");
    }
    else
    {
        Console.WriteLine("The triangle is scalene.");
    }
}

private static bool AllSidesAreEqual (int side1, int side2, int side3)
{
    return (side1 == side2) 
        && (side2 == side3);
}

private static bool AtLeastTwoSideAreEqual (int side1, int side2, int side3)
{
    return (side1 == side2)
        || (side2 == side3)
        || (side1 == side3);
}

Upvotes: 4

Kit
Kit

Reputation: 21709

This version reduces the conditional checks to 3 at the expense of some mathematical skulduggery:

int count = 0;
if (side1 - side2 != 0) count++;
if (side2 - side3 != 0) count++;
if (side3 - side1 != 0) count++;

var types = new [] { "equilateral", "invalid", "isoceles", "scalene" };

Console.WriteLine("The triangle is {0}.", types[count]);

The comparisons reduce comparisons of length to comparisons of differences in length for any two sides. Then a lookup into a table.

Upvotes: 0

Joe
Joe

Reputation: 1139

Thanks to logic, you can simplify your second if: you do not need to test for !=, because if they were equal, the first if would have been satisfied already.

static void typeTri()
    {
        if (side1 == side2 && side2 == side3)
        {
            Console.WriteLine("The triangle is equilateral.");
        }
        else if ((side1 == side2) || (side2 == side3) || (side1 == side3))
        {
            Console.WriteLine("The triangle is isoceles.");
        }
        else if ((side1 >= side2 + side3) || (side2 >= side1 + side3) || (side3 >= side1 + side2) || (side1 <= 0) || (side2 <= 0) || (side3 <= 0))
        {
            Console.WriteLine("Not a Triangle");
        }
        else
        {
            Console.WriteLine("The triangle is scalene.");
        }
    }

You also need to consider the case that this is not a triangle at all, but that requirement might be out of scope for this specific question.

Upvotes: 7

Kit
Kit

Reputation: 21709

This minimizes the conditionals a bit and by using the ternary operator, it's compact:

Console.WriteLine(
    "The triangle is {0}.",
    side1 != side2
        ? (side2 != side3 && side1 != side3 ? "scalene" : "isoceles")
        : (side3 == side1 ? "equilateral" : "iscoceles");

Upvotes: 0

Related Questions