题目描述
定义一个三角形类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(这个阈值可改,根据实际情况改动)