三角形类(构造与析构)

题目描述

定义一个三角形类CTriangle,属性包含三条边和三角形类型,其中用字符串保存三角形类型。三角形类型如下:

等腰三角形:isosceles triangle
直角三角形:right triangle
等腰直角三角形:isosceles right triangle
等边三角型:equilateral triangle
一般三角形:general triangle
不能构成三角形:no triangle

其中判断直角三角形条件:三角形三边中的一边长度平方等于另两边长度平方之和

类行为包括构造、析构、计算面积等等。其中构造函数将设置三条边长度,并且判断三条边能否构成三角形、并设置三角形类型。析构函数将三条边长度清0,并将三角形类型设置为none

三角形面积计算如下

输入

测试数据的组数

第一组边1 第一组边2  第一组边3

第二组边1 第二组边2 第二组边3

......

输出

第一个三角形类型,面积

第二个三角形类型,面积

......

如果不形成三角形,就无需输出面积

面积精度到小数点后1位

输入样例:

3
3.0 2.0 6.0
3.0 4.0 5.0
1.0 1.0 1.414

输出样例:

no triangle
right triangle, 6.0
isosceles right triangle, 0.5

代码展示

#include <iostream>
using namespace std;
#include <iomanip>
#include <algorithm>
#include <math.h>

string triangles[6] = {"isosceles triangle","right triangle","isosceles right triangle",
    "equilateral triangle","general triangle","no triangle"};

class CTriangle
{
    double a,b,c;
    string lei;
    string triangles[6] = {"isosceles triangle","right triangle","isosceles right triangle",
              "equilateral triangle","general triangle","no triangle"};
    public:
        CTriangle(double a1,double b1,double c1):a(a1),b(b1),c(c1)
        {
            if(is_tri())
            {
                int lei = what_tri();
                cout << triangles[lei] << ", " << fixed << setprecision(1) << square() << endl;
            }
            else{
                cout << "no triangle" << endl;
            }
        }
        bool is_tri();
        int what_tri();
        double square();
        ~CTriangle()
        {
            a = 0;
            b = 0;
            c = 0;
            lei = "none";
        }
};

bool CTriangle::is_tri()
{
        if(a+b>c && a+c>b && b+c>a)
        return 1;
    else return 0;
}
int CTriangle::what_tri()
{
    if((a==b && abs(c-sqrt(a*a+b*b)) < 1e-1) || (a==c && abs(b-sqrt(a*a+c*c)) < 1e-1) 
            || (b==c && abs(a-sqrt(b*b+c*c)) < 1e-1))
        return 2;
    else if((a==b && a!=c && b!=c) || (a==c && a!=b && c!=b) || 
        (b==c && b!=a && c!=a))
        return 0;
    else if(abs(a*a+b*b-c*c)<1e-1 || abs(a*a+c*c-b*b)<1e-1 || abs(b*b+c*c-a*a)<1e-1)
        return 1;
    else if((a==b && a*a+b*b==c*c) || (a==c && a*a+c*c==b*b) 
            || (b==c && b*b+c*c==a*a))
        return 2;
    else if(a==b && b==c)
        return 3;
    else return 4;
}
double CTriangle::square()
{
    double p = (a+b+c)/2.0;
    double s = sqrt(p*(p-a)*(p-b)*(p-c));
    return s;
}

int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        double a,b,c;
        cin >> a >> b >> c;
        CTriangle(a,b,c);
    }
}

注意事项:

1、if-else是有先后顺序的,为了节约代码判断,可以先判断等腰直角再判断等腰和直角的

2、判断直角时由于是有根号数约等于有限小数的,所以用类似abs(a*a+b*b-c*c)<1e-1(这个阈值可改,根据实际情况改动)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值