700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 三角形形状判断(等边 等腰 直角 等腰直角 非等边)

三角形形状判断(等边 等腰 直角 等腰直角 非等边)

时间:2018-08-14 21:04:17

相关推荐

三角形形状判断(等边 等腰 直角 等腰直角 非等边)

经典测试——三角形形状判断

使用C语言编程程序:

printf("请输入三角形的三条边长度:【请输入整数(需输入根号可在后续选择)】\n");triangle.a = triangle.input('a');//边a的输入triangle.b = triangle.input('b');triangle.c = triangle.input('c');

建立了Triangle类后,定义了3个float型的变量作为边长。后使用switch来完成输出:

switch (triangle.getTriangleType(triangle.a, triangle.b, triangle.c)){case Not_a_Triangle:printf("输入参数非法\n");break;case Scalene:printf("不等边三角形\n");break;case Isosceles:printf("等腰三角形\n");break;case Equilateral:printf("等边三角形\n");break;case RightAngled:printf("直角三角形\n");break;case isoscelesRight:printf("等腰直角三角形\n");break;}

以上,main函数完成。

由于边长需要是整数型的输入,C不像是java那样子可以直接进行异常判断,需要自己写一个判断整数的函数:

bool isInteger(float number){if (fabs(number - (int)number) < 1e-8) return true;else return false;}

由于判断等腰直角三角形是需要带根号的(我百度过,说是没有“三边都是整数”的等腰直角三角形),然而C语言并没有直接输入根号的方法可用,那么就考虑在输入的时候让用户来手动的选择是否需要输入根号:

float Triangle::input(char t){float tmp = 0;int choice = 0;while (true){printf("%c = ? ", t);scanf("%f", &tmp);printf("当前输入的数字是否带根号?是:1否:0\n");scanf("%d", &choice);printf("\n");if (isInteger(tmp))//判断当前输入的是否为整数{if (choice == 0)//不带根号则直接返回输入的边长return tmp;else if (choice == 1)return sqrt(tmp);//带有根号则直接返回其根号后的值}else{printf("请输入整数!");continue;}}}

最后一步,就是需要根据计算结果来判断三角形的形状了:

int Triangle::getTriangleType(float a, float b, float c){// 注意下面 int 到 long 的转换,如果不转换,那么对于 a + b <= c// 这样的逻辑表达式,当 a 和 b 的取值接近系统中 int 数据类型的极// 大值时,表达式将溢出,逻辑运算的结果与预期不符long al = a, bl = b, cl = c;float a_2 = (float)(a*a);//计算各边的平方float b_2 = (float)(b*b);float c_2 = (float)(c*c);// 使用“两条边之和大于第三边”的定理进行三角形合法性判定,这一// 方法同样适用于输入值中包含 0 或负数的情况。但此判定必须在等边和等腰判定之前if (al + bl <= cl || bl + cl <= al || cl + al <= bl)// return Not_a_Triangle;//不构成三角形else if (a == b && b == c)return Equilateral;//等边else if (fabs(a_2 -( b_2 + c_2) <1e-5) || (fabs(b_2 == a_2 + c_2) < 1e-5) || (fabs(c_2 == a_2 + b_2) < 1e-5)) {//直角三角形if (fabs((float)a-(float)b)<1e-5 || fabs((float)b - (float)c)<1e-5 || fabs((float)c - (float)a)<1e-5){return isoscelesRight;//等腰直角}else return RightAngled;}else if (a == b || b == c || c == a)return Isosceles;//等腰elsereturn Scalene;//不等边三角形return 0;}

其中需要注意两点:

1. 判断“等腰直角三角形”的代码必须要在“等腰三角形”之后,避免当前程序判断成为等腰三角形后就直接跳出了。

2. 在判断a^2 == b^2 + c^2 时,由于有一条边是使用根号sqrt()平方后得来的(例如√2 = 1.414,而1.414^2 != 2)

此时就使用绝对值来进行判断即可“fabs((float)a-(float)b)<1e-5”。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。