c++用类求三角形周长面积,要用到构造函数,析构函数,求大神指教

如题所述

#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;
}
温馨提示:答案为网友推荐,仅供参考
相似回答