经典测试——三角形形状判断
使用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”。