From f0f0058645daa00f15d5512aae56a3e629c894fa Mon Sep 17 00:00:00 2001 From: Dmitry Kokorin Date: Thu, 17 Mar 2016 15:54:31 +0300 Subject: [PATCH] triangle: iteration 1 --- cpp/triangle/triangle.cpp | 65 +++++++++++++++++++++++++++++++++++++++ cpp/triangle/triangle.h | 17 ++++++++++ 2 files changed, 82 insertions(+) create mode 100644 cpp/triangle/triangle.cpp create mode 100644 cpp/triangle/triangle.h diff --git a/cpp/triangle/triangle.cpp b/cpp/triangle/triangle.cpp new file mode 100644 index 0000000..c7ee869 --- /dev/null +++ b/cpp/triangle/triangle.cpp @@ -0,0 +1,65 @@ +#include "triangle.h" + +#include +#include +#include + +namespace triangle { + +using namespace std; + +namespace { + + +inline bool fuzzy_equal(double a, double b) +{ + typedef numeric_limits 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; +} + +} diff --git a/cpp/triangle/triangle.h b/cpp/triangle/triangle.h new file mode 100644 index 0000000..3dc7f34 --- /dev/null +++ b/cpp/triangle/triangle.h @@ -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); + +}