给定平面上任意三个点的坐标(x1,y1)、(x2 ,y2)、(x3 ,y3),检验它们能否构成三角形。
输入:在一行中顺序给出六个[−100,100]范围内的数字,即三个点的坐标x1,y1,x2 ,y2,x3 ,y3
输出:若这3个点不能构成三角形,则在一行中输出“Impossible”;若可以,则在一行中输出该三角形的周长和面积,格式为“L = 周长, A = 面积”,输出到小数点后2位。
写代码前理清思路
Impossible存在两种可能性
(1) 3个点的连线不相交,说明有2条平行
(2) 3个边不满足2条边大于第3边
知道这个之后开始写代码
#include<stdio.h>
#include<math.h>
int main(void)
{
int i;
double x[6], a,b,c,p; // x[6],输入3个坐标
for (i=0; i<6; i++)
{
scanf("%lf", &x[i]);
}
//第1个impossible
if( (x[1]-x[3])/(x[0]-x[2])==(x[1]-x[5])/(x[0]-x[4]) || (x[1]-x[5])/(x[0]-x[4])==(x[3]-x[5])/(x[2]-x[4]) || (x[3]-x[5])/(x[2]-x[4])==(x[1]-x[3])/(x[0]-x[2]) ) //斜率一样不能
//(x[1]-x[3])/(x[0]-x[2]) 两点之间的斜率,也可以给斜率赋值,更加美观
// 例如 : y1 = (x[1]-x[3])/(x[0]-x[2]);
//y2 = (x[1]-x[5])/(x[0]-x[4]);
//y3 = (x[3]-x[5])/(x[2]-x[4]);
{
printf("Impossible\n");
return 0;
}
//三边
a = sqrt(pow(x[0]-x[2],2)+pow(x[1]-x[3],2));
b = sqrt(pow(x[0]-x[4],2)+pow(x[1]-x[5],2));
c = sqrt(pow(x[2]-x[4],2)+pow(x[3]-x[5],2));
if ((a+b>c) || (a+c)>b || (b+c)>a)
{
p = 1.0/2*(a+b+c);//海伦公式
printf("L = %.2lf, A = %.2lf\n",a+b+c, sqrt((p*(p-a)*(p-b)*(p-c))));
}
//第2个
else
printf("Impossible\n");
return 0;
}