c语言程序,输入三角形三边的长度,判断是不是三角形,若是,在判断为何种三角形,并求其面积

如题所述

#include <stdio.h>
#include <math.h>

// 最小精度
double eps = 1e-5;

// 圆周率常量
double PI = acos(-1);

// 枚举三角形类型,分别为:
// 非法三角形,锐角三角形,等边三角形,等腰三角形,直角三角形,等腰直角三角形,钝角三角形
enum TriangleType{NOT_ANGLE, ACUTE_TRIANGLE, REGULAR_TRIANGLE, ISOCELES_TRIANGLE,
RIGHT_TRIANGLE, ISOCELES_RIGHT_TRIANGLE, OBTUSE_TRIANGLE};

/*
功能:根据变长,判断三角形的类型
参数:
a,b,c 三角形的三条边长
返回:
三角形的类型。见: TriangleType。
说明:
应用了余弦定理:
cosA = (b^2 + c^2 - a^2)/2bc
*/
TriangleType getTypeOFTriangle(double a, double b, double c)
{
// 边 a, b, c 对应的角的度数(弧度制)
double angle_A, angle_B, angle_C;

// 三边长度必须必须是正数
if(a<= eps || b<= eps || c <= eps)
return NOT_ANGLE;
// 两边之和必须大于第三边
if((a+b) -c <= eps || (a+c) - b <= eps || (b+c) - a <= eps )
return NOT_ANGLE;
// 两边之差必须小于第三边
if(fabs(a-b) - c>= eps || fabs(a-c) - b >= eps || fabs(b-c) - a >= eps)
return NOT_ANGLE;

angle_A = acos((b*b + c*c - a*a) / (2.0 * b * c));
angle_B = acos((a*a + c*c - b*b) / (2.0 * a * c));
angle_C = acos((a*a + b*b - c*c) / (2.0 * a * b));

if(fabs(angle_A - angle_B) <= eps && fabs(angle_B - angle_C) <= eps)
return REGULAR_TRIANGLE;

else if(fabs(angle_A - angle_B) <= eps)
return angle_C - PI/2.0 <= eps ? ISOCELES_RIGHT_TRIANGLE : ISOCELES_TRIANGLE ;
else if(fabs(angle_A - angle_C) <= eps)
return angle_B - PI/2.0 <= eps ? ISOCELES_RIGHT_TRIANGLE : ISOCELES_TRIANGLE ;
else if(fabs(angle_B - angle_C) <= eps)
return angle_A - PI/2.0 <= eps ? ISOCELES_RIGHT_TRIANGLE : ISOCELES_TRIANGLE ;

else if(fabs(angle_A - PI/2.0) <= eps && fabs(angle_B - PI/2.0) <= eps && fabs(angle_C - PI/2.0) <= eps)
return ACUTE_TRIANGLE;

else if(fabs(angle_A - PI/2.0 ) <= eps || fabs(angle_B - PI/2.0) <= eps || (angle_C - PI/2.0) <= eps)
return RIGHT_TRIANGLE;

else
return OBTUSE_TRIANGLE;
}

/*
功能:根据变长,计算三角形面积
参数:
a,b,c 三角形的三条边长
返回:
三角形的面积。如果 a,b,c 无法组成三角形,返回 -1。
说明:
函数运用了海伦公式:
S = √(p*(p-a)*(p-b)*(p-a))
其中 p = (a+b+c)/2。
*/
double getAreaOfTriangle(double a, double b, double c)
{
double p = (a + b + c) / 2.0;
if(NOT_ANGLE == getTypeOFTriangle(a, b, c))
return -1;
else
return sqrt(p* (p-a) * (p-b) * (p-c));
}

int main(int argc, char *argv[])
{
// 三角形的三边长
double a,b,c;
while(scanf("%lf%lf%lf", &a, &b, &c) != EOF)
{
switch(getTypeOFTriangle(a, b, c))
{
case NOT_ANGLE:
printf("%lf %lf %lf 不能组成三角形!\n", a, b, c);
break;
case REGULAR_TRIANGLE:
printf("%lf %lf %lf 能组成等边三角形,面积为:%lf!\n", a, b, c, getAreaOfTriangle(a, b, c));
break;
case ISOCELES_TRIANGLE:
printf("%lf %lf %lf 能组成等腰三角形,面积为:%lf!\n", a, b, c, getAreaOfTriangle(a, b, c));
break;
case ACUTE_TRIANGLE:
printf("%lf %lf %lf 能组成锐角三角形,面积为:%lf!\n", a, b, c, getAreaOfTriangle(a, b, c));
break;
case RIGHT_TRIANGLE:
printf("%lf %lf %lf 能组成直角三角形,面积为:%lf!\n", a, b, c, getAreaOfTriangle(a, b, c));
break;
case ISOCELES_RIGHT_TRIANGLE:
printf("%lf %lf %lf 能组成等腰直角三角形,面积为:%lf!\n", a, b, c, getAreaOfTriangle(a, b, c));
break;
case OBTUSE_TRIANGLE:
printf("%lf %lf %lf 能组成钝角三角形,面积为:%lf!\n", a, b, c, getAreaOfTriangle(a, b, c));
break;
default:
;
}
}
return 0;
}
/*
测试数据:
1.0 2 3
3 3 3
4 4 7
4 4.5 5
3 4 5
1.4142135 1.4142135 2
5.5 5 10
*/
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-10
【分析】
使用C语言,编程实现判断是不是三角形,若是三角形则求其面积。

源代码

#include <stdio.h>
#include <math.h>
int main() {
double a,b,c,girth,area,p;
printf("请输入三角形的三条边 : ");
scanf("%lf%lf%lf",&a,&b,&c);
if(a + b > c && a - b < c) {
if(a * a + b * b == c * c || a * a + c * c == b * b || c * c + b * b == a * a)
printf("%.2lf,%.2lf,%.2lf构成直角三角形。\n",a,b,c);
p = (a + b + c)/2.0;
girth = a + b + c;
printf("周长为 : %.2lf\n",girth);
area = sqrt((p - a)*(p - b)*(p - c));
printf("面积为 : %.2lf\n",area);
}
else printf("%.2lf,%.2lf,%.2lf,不能构成三角形。\n",a,b,c);
return 0;}本回答被网友采纳
第2个回答  2013-01-10
#include <stdio.h>
#include <math.h>

void main()
{
double a,b,c,s,area;
printf("请输入三角形三边长度,以空格隔开:\n");
if(3 == scanf("%lf %lf %lf",&a,&b,&c))
{
if(a+b<=c||a+c<=b||b+c<=a)
{
printf("三边长度不能构成三角形!\n");
return;
}
else if(a==b && b==c)
{
printf("三边长度构成等边三角形。\n");
}
else if(a==b&&a*a+b*b==c*c||a==c&&a*a+c*c==b*b||b==c&&c*c+b*b==a*a)
{
printf("三边长度构成等腰直角三角形。\n");
}
else if(a==b||b==c||c==a)
{
printf("三边长度构成等腰三角形。\n");
}
else if(a*a+b*b==c*c||a*a+c*c==b*b||c*c+b*b==a*a)
{
printf("三边长度构成直角三角形。\n");
}
else
{
printf("三边长度构成普通三角形。\n");
}
}

s = (a+b+c)/2;
area = sqrt((s - a)*(s - b)*(s - c));
printf("面积为 : %.2lf\n",area);
}
第3个回答  2013-01-10
#define not_triangle -1; //不是三角形
#define normal_triangle 0 //一般三角形
#define isosceles_triangle 1 //等腰三角形
#define right_angled_triangles 2 //直角三角形
#define right_angled_isosceles_triangles 3 //等腰直角三角形
#define equilateral_triangle 4//等边三角形
int judge(float a, float b, float c) {
int triangles = -1;
if (a + b < c || a + c < b || b + c < 1)
triangles = not_triangle; //不是三角形
else if(a==b&&b==c)
triangles = equilateral_triangle; //等边三角形
else if(a==b||b==c||a==c)
{
triangles = isosceles_triangle;//等腰三角形
if(pow(a,2)+pow(b,2)==c||pow(a,2)+pow(c,2)==b||pow(b,2)+pow(c,2)==a)
triangles = right-angled_isosceles_triangles;//等腰直角三角形
} else if(pow(a,2)+pow(b,2)==c||pow(a,2)+pow(c,2)==b||pow(b,2)+pow(c,2)==a)
triangles = right_angled_triangles;//直角三角形
else
triangles = normal_triangle;//一般三角形
return triangles;
}
float getArea(float a, float b, float c) {
//(p=(a+b+c)/2)
//S=√[p(p-a)(p-b)(p-c)]
float p = (a + b + c) / 2;
float s = sqrtf(p * (p - a) * (p - b) * (p - c));
return s;
}
int main(int argc, char **argv) {
float a, b, c;
scanf("%f%f%f", &a, &b, &c);
switch (judge(a, b, c)) {
case not_triangle:
printf("不是三角形\n");
break;
case normal_triangle
printf("一般三角形\n");
break;
}
if(judge(a, b, c)!=not_triangle)
printf("面积等于%.2f\n", getArea(a, b, c));
return 0;
}
相似回答