定义二维点(Point)类,包含点的坐标x和y,再定义二维的三角形 (Triangle)类,在三角形类中能对三角形类别,首先判断输入的三个点能否 构成三角形,然后判断是否为等腰三角形、等边三角形、直角三角形、等腰 直角三角形。 提示: (1)思考程序中相等判断运算符是否采用“==”? (2)坐标值精确到小数点后3位, 2 =1.414, 3 =1.732, 5 =2.236,可以采 用以下测试数据: 等腰三角形:(0,0),(0,2),( 5 ,1) 等边三角形:(0,0),(0,2),( 3 ,1) 直角三角形:(1,0),(0,0),(0,2) 等腰直角三角形(0,0),(0,2),( 2 ,1)
判断是否为三角形:三角形任意两边之和大于第三边
判断三角形的类别根据各种条件建立相关函数
等腰三角形 有两边相等,用或条件
主要的问题根据输入的时候无理数(带根号的取小数点后三位,会有一定误差)不能直接用==来进行条件判断所以要利用差值来与1e-6之类的数,可根据平方与否来进行选择相应小数的位数,
有时候这个浮点数还挺麻烦
#pragma once
#include "Point.h"
#include<iostream>
#include<cmath>
using namespace std;
bool Triangle::judge1(Point a, Point b, Point c) {
double m, l, n;
m = ((a.getx() - b.getx())*(a.getx() - b.getx())+ (a.gety() - b.gety())*(a.gety() - b.gety()));
n = ((a.getx() - c.getx())*(a.getx() - c.getx()) + (a.gety() - c.gety())*(a.gety() - c.gety()));
l = ((b.getx() - c.getx())*(b.getx() - c.getx()) + (b.gety() - c.gety())*(b.gety() - c.gety()));
if (((m+n)*(m + n) >l)&&((m+l)*(m + l) >n)&&((l+n)*(l + n) >m)){
return true;
}
else return false;
}
void Triangle::judge2(Point a, Point b, Point c) {
//等腰三角形
double m, l, n;
m = ((a.getx() - b.getx())*(a.getx() - b.getx()) + (a.gety() - b.gety())*(a.gety() - b.gety()));
n = ((a.getx() - c.getx())*(a.getx() - c.getx()) + (a.gety() - c.gety())*(a.gety() - c.gety()));
l = ((b.getx() - c.getx())*(b.getx() - c.getx()) + (b.gety() - c.gety())*(b.gety() - c.gety()));
if (fabs(n + m - l ) < 1e-6 || fabs(m + l - n ) < 1e-6 || fabs(m + n - l ) < 1e-6) {
cout << "该三角形为直角三角形" << endl;
if (fabs(m - n) < 1e-4 || fabs(m - l) < 1e-4 || fabs(l - n) < 1e-4) {
cout << "且该三角形为等腰直角三角形" << endl;
}
}
else if (fabs(sqrt(m) - sqrt(n)) < 1e-6|| fabs(sqrt(m) - sqrt(l)) < 1e-6 || fabs(sqrt(l) - sqrt(n)) < 1e-6)
{
if (fabs(sqrt(m) -sqrt( n)) < 1e-3 && fabs(sqrt(m) - sqrt(l)) < 1e-3 && fabs(sqrt(l) -sqrt( n)) < 1e-3)
{
cout << "该三角形为等边三角形" << endl;
}
else
cout << "该三角形为等腰三角形" << endl;
}
else cout << "该三角形为普通三角形" << endl;
}
int main() {
Triangle T;
Point A;
Point B;
Point C;
int flag=0;
do {
cout << "请输入第一个横坐标:" << endl;
double x1, y1, x2, y2, x3, y3;
cin >> x1;
A.setx(x1);
cout << "请输入第一个纵坐标:" << endl;
cin >> y1;
A.sety(y1);
cout << "请输入第二个横坐标:" << endl;
cin >> x2;
B.setx(x2);
cout << "请输入第二个纵坐标:" << endl;
cin >> y2;
B.sety(y2);
cout << "请输入第三个横坐标:" << endl;
cin >> x3;
C.setx(x3);
cout << "请输入第三个纵坐标:" << endl;
cin >> y3;
C.sety(y3);
T.judge1(A, B, C);
if (T.judge1(A, B, C)) {
cout << "该图形为三角形" << endl;
T.judge2(A, B, C);
}
else
{
cout << "该图形不是三角形" << endl;
}
cout << "是否继续?请输入:1继续 0退出" << endl;
cin >> flag;
}while (flag);
return 0;
}
#pragma once
class Point {//二维点类
private:
double p_x, p_y;//坐标x,y
public:
void setx(double x) {
p_x = x;
}
double getx() {
return p_x;
}
void sety(double y) {
p_y = y;
}
double gety() {
return p_y;
}
};
class Triangle {//三角形类
public:
bool judge1(Point a, Point b, Point c);
void judge2(Point a, Point b, Point c);
};