小学期 三角形的类别判断 C++

定义二维点(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);
	

	
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值