triangle: iteration 2

This commit is contained in:
Dmitry Kokorin 2016-03-17 19:12:35 +03:00
parent f0f0058645
commit 489e524385

View file

@ -10,7 +10,6 @@ using namespace std;
namespace {
inline bool fuzzy_equal(double a, double b)
{
typedef numeric_limits<double> limits_t;
@ -24,39 +23,25 @@ inline bool fuzzy_equal(double a, double b)
|| abs(a - b) < min;
}
inline bool is_valid(double a, double b, double c)
{
return a > 0 && b > 0 && c > 0
&& a + b > c
&& a + c > b
&& b + c > a;
}
inline bool is_equilateral(double a, double b, double c)
{
return fuzzy_equal(a, b)
&& fuzzy_equal(a, c)
&& fuzzy_equal(b, c);
}
inline bool is_isosceles(double a, double b, double c)
{
return fuzzy_equal(a, b)
|| fuzzy_equal(a, c)
|| fuzzy_equal(b, c);
}
}
kind_t kind(double a, double b, double c)
{
if (!is_valid(a, b, c))
if (a > b) swap(a, b);
if (a > c) swap(a, c);
if (b > c) swap(b, c);
if (a <= 0)
throw domain_error("invalid triangle");
if (is_equilateral(a, b, c))
if (a + b <= c)
throw domain_error("");
if (fuzzy_equal(a, c))
return equilateral;
if (is_isosceles(a, b, c))
if (fuzzy_equal(a, b) || fuzzy_equal(b, c))
return isosceles;
return scalene;