一、题目描述
给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形。
输入格式:
输入在一行中顺序给出六个[−100,100]范围内的数字,即三个点的坐标x1、y1、x2、y2、x3、y3。
输出格式:
若这3个点不能构成三角形,则在一行中输出“Impossible”;若可以,则在一行中输出该三角形的周长和面积,格式为“L = 周长, A = 面积”,输出到小数点后2位。
输入样例1:
4 5 6 9 7 8
输出样例1:
L = 10.13, A = 3.00
输入样例2:
4 6 8 12 12 18
输出样例2:
Impossible
二、写代码前置知识
1、直角坐标系中已知三个点求三角形各边的长度
2、余弦定理运用求cosine值,将consine转成sine,再利用面积求解公式求三角形面积
具体求解步骤如下图
C++进行四则运算要包含头文件<cmath>----此头文件包含了一系列的数学运算函数,这个题目要用到的如下
sqrt(x):对x进行开平方根运算
pow(x,a):对x进行a次方运算
fabs(x):对x取绝对值(这里是double类型用fabs,若是整型用abs)
三、C++实现
#include<iostream>
#include<cmath>//!!要包含四则运算的头文件
#include<iomanip>//<iomanip>头文件包含了输入输出格式化的各种函数如下面要用到的setprecision(2)
using namespace std;
double getTriArea(double, double, double);//要调用的函数在main()函数下面,对其进行一个声明
int main() {
double x1, x2, x3, y1, y2, y3;
cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
//求三角形三条边a,b,c的长度
double a = sqrt(pow(fabs(x3 - x2), 2) + pow(fabs(y3 - y2), 2));
double b = sqrt(pow(fabs(x3 - x1), 2) + pow(fabs(y3 - y1), 2));
double c = sqrt(pow(fabs(x2 - x1), 2) + pow(fabs(y2 - y1), 2));
if (a + b > c && b + c > a && a + c > b) {
//周长直接三条边相加即可
cout << fixed << setprecision(2) << "L = " << a + b + c << ",";
float area = getTriArea(a, b, c);
//这里的cout<<fixed<<setprecision(2)<<x;的作用是使变量值统一保留到小数点后两位
cout << fixed << setprecision(2) << " A = " << area << endl;
}
else {
cout << "Impossible";
}
}
double getTriArea(double a, double b, double c) {
//正弦 sine 余弦 cosine 利用余弦定理和求三角形面积公式0.5 * a * b * sine
double cosine = (pow(a, 2) + pow(b, 2) - pow(c, 2)) / (2 * a * b);
double sine = sqrt(1 - pow(cosine, 2));
double aria = 0.5 * a * b * sine;
return aria;
}
我第一次写的时候用的是float类型存储,在提交的时候显示输入为实数的时候答案错误,后把所有float全部改成double提交测试成功(应该是PTA的格式bug)