Reputation: 313
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
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
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
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
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