#include <iostream>
#include <string>
#include <cmath>
using namespace std;
const static double PRECISION = 0.000001;
class Triangle
{
public:
Triangle();
Triangle(double a, double b, double c);
~Triangle();
// 设置三角形
void set_triangle(double a, double b, double c);
// 获取面积
double get_area() const;
// 获取周长
double get_perimeter() const;
// 设置三角形名称,可随便取值,方便查看析构函数调用情况
void set_name(string str);
private:
// 是否是有效的三角形
bool is_triangle() const;
private:
double edge_a;
double edge_b;
double edge_c;
string name;
};
Triangle::Triangle()
: edge_a(0.0), edge_b(0.0), edge_c(0.0), name("triangle")
{
}
Triangle::Triangle(double a, double b, double c)
: edge_a(a), edge_b(b), edge_c(c), name("triangle")
{
}
Triangle::~Triangle()
{
cout << "bye " << name << endl;
}
void Triangle::set_triangle(double a, double b, double c)
{
edge_a = a;
edge_b = b;
edge_c = c;
}
// 如果任一边长在[-PRECISION, PRECISION]之间,则认为其值为0
bool Triangle::is_triangle() const
{
if (-PRECISION <= edge_a && PRECISION >= edge_a ||
-PRECISION <= edge_b && PRECISION >= edge_b ||
-PRECISION <= edge_c && PRECISION >= edge_c)
return false;
return true;
}
// 海伦公式
// p = 1/2(a + b + c)
// s = sqrt(p(p-a)(p-b)(p-c))
double Triangle::get_area() const
{
if (!is_triangle())
{
cerr << "invalid triangle!" << endl;
return PRECISION;
}
double p = get_perimeter() / 2;
return sqrt(p * (p - edge_a) * (p - edge_b) * (p - edge_c));
}
double Triangle::get_perimeter() const
{
if (!is_triangle())
{
cerr << "invalid triangle!" << endl;
return PRECISION;
}
return edge_a + edge_b + edge_c;
}
void Triangle::set_name(string str)
{
name = str;
}
// test
int main()
{
Triangle tri;
Triangle t(3, 4, 5);
tri.set_triangle(3.0, 4, 5);
tri.set_name("first triangle");
t.set_name("second triangle");
cout << tri.get_area() << " : " << tri.get_perimeter() << endl;
cout << t.get_area() << " : " << t.get_perimeter() << endl;
return 0;
}
温馨提示:答案为网友推荐,仅供参考