triangle: iteration 1
This commit is contained in:
parent
e74c3dd04f
commit
f0f0058645
2 changed files with 82 additions and 0 deletions
65
cpp/triangle/triangle.cpp
Normal file
65
cpp/triangle/triangle.cpp
Normal 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
17
cpp/triangle/triangle.h
Normal 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);
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue