编程输入三角形的三条边,判断它们能否构成三角形。若可以构成三角形,指出是何种三角形:等腰三角形,直角三角形,还是一般三角形?
C语言实现如下:
#include<stdio.h>
#include<math.h>
#define EPS 1e-7
int main(){
float a, b, c;
int flag = 1;
printf("Input a, b, c: ");
scanf("%f,%f,%f",&a,&b,&c);
if(a+b>c && b+c>a && a+c>b){
/* 先判断是否为等边三角形再判断是否为等腰三角形: 等边三角形一定是等腰三角形,但反之不一定。 */
if(fabs(a-b)<=EPS && fabs(b-c)<=EPS && fabs(c-a)<=EPS){
printf("等边");
flag = 0;
//标志位置零
}
else if(fabs(a-b)<=EPS || fabs(b-c)<=EPS || fabs(c-a)<=EPS){
printf("等腰");
flag = 0;
//标志位置零
}
if(fabs(a*a+b*b-c*c)<=EPS || fabs(a*a+c*c-b*b)<=EPS || fabs(c*c+b*b-a*a)<=EPS){
printf("直角");
flag = 0;
}
if(flag){
printf("一般");
}
printf("三角形");
}
else{
printf("不是三角形\n");
}
}
从这个例子中,我们看到由于等腰三角形好,直角三角形不是非此即彼的关系,而是存在交叉,集合的相交部分正是等腰直角三角形,
因此不可以用if-else语句来依次判断是否是等腰三角形和直角三角形,应该用并列的if语句来判断。
注意点1:一般地,只有非此即彼的关系才采用if-else语句,而对于有交叉的关系,应使用两个并列的if语句,这一点是值得我们思考的地方。
注意点2:内存中的浮点数所 表示的精度是有限的,所以比较实行变量与与0是否相等或者两个实型变量是否相等时,
不能像整形变量与0比较那样直接用相等关系运算符与0比较,而应该判断实型变量的值是否位于0附近的一个很小的区间内或者两个实型变量的差值
是否足够小来进行实型变量的比较。
程序虽小,奥妙无穷,与大家共勉!