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

 

使用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;		//	等腰

	else
		return 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”。