triangle: iteration 1

This commit is contained in:
Dmitry Kokorin 2016-03-17 15:54:31 +03:00
parent e74c3dd04f
commit f0f0058645
2 changed files with 82 additions and 0 deletions

65
cpp/triangle/triangle.cpp Normal file
View file

@ -0,0 +1,65 @@
#include "triangle.h"
#include <cmath>
#include <limits>
#include <stdexcept>
namespace triangle {
using namespace std;
namespace {
inline bool fuzzy_equal(double a, double b)
{
typedef numeric_limits<double> limits_t;
static const double &epsilon = limits_t::epsilon();
static const double &min = limits_t::min();
static const double &round_error = limits_t::round_error();
return abs(a - b) < epsilon * abs(a + b) * round_error
|| 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))
throw domain_error("invalid triangle");
if (is_equilateral(a, b, c))
return equilateral;
if (is_isosceles(a, b, c))
return isosceles;
return scalene;
}
}

17
cpp/triangle/triangle.h Normal file
View file

@ -0,0 +1,17 @@
#pragma once
#define EXERCISM_RUN_ALL_TESTS
namespace triangle {
enum kind_t
{
equilateral,
isosceles,
scalene
};
kind_t kind(double, double, double);
}