该程序检查简单的三角形类型:等边,等腰,直角等。但我得到了非常奇怪的结果。
我的代码:
#include <stdio.h>
#include <stdlib.h>
int comparator (const void * elem1, const void * elem2) {
int f = *((float*)elem1);
int s = *((float*)elem2);
if (f > s) return 1;
if (f < s) return -1;
return 0;
}
void checkTriangles(float *num){
float a = *num;
float b = *(num + 1);
float c = *(num + 2);
if((a*a + b*b)==c*c){
printf("right angled triangle");
}
else if(a==b || b==c || c==a){
printf("isosceles triangle");
}
else if(a==b && b==c){
printf("equilateral triangle");
}
else if(a!=b && b!=c && c!=a && ((a+b)>c)){
printf("normal triangle");
}
else{
printf("invalid");
}
}
int main(void){
char c = 'a';
char str[12];
float num[3];
while(c!='q'){
printf("\n\nenter the sides : ");
fgets(str , sizeof(str) , stdin);
sscanf(str , "%f%f%f", num , num + 1 , num + 2);
qsort(num, sizeof(num)/sizeof(*num), sizeof(*num), comparator);
printf("\n%f\n%f\n%f\n", num , num + 1 , num + 2);
checkTriangles(num);
printf("\nenter q to quit.. any other to continue : ");
c=getchar();
}
return 0;
}
然而,我得到像这样的真正的奇数输出:
我知道使用快速排序这样的东西是矫枉过正,但我想保持简短并使用比较器,只是为了好玩。
编辑:iv添加完整代码,并检查比较器以检查浮动,但仍然获得相同的输出。
答案 0 :(得分:6)
这是一个未定义行为的大问题:
printf("\n%f\n%f\n%f\n", num , num + 1 , num + 2);
此处您使用指针指向printf
调用中的值,但您应使用值。
改为例如
printf("\n%f\n%f\n%f\n", num[0], num[1], num[2]);
注意:没有必要继续使用指针取消引用,你有一个数组,为什么不使用数组语法呢?
答案 1 :(得分:2)
if条件:
else if(a==b || b==c || c==a){
printf("isosceles triangle");
}
对于等腰三角形和等边三角形,将评估为true - 当您传递a = 5, b = 5, c = 5,
时,此if-condition计算结果为true并打印等腰。你想要这样的东西:
else if( (a==b || b==c || c==a) && !(a==b && a==c){
printf("isosceles triangle");
}
然后当你给出一个等边三角形时,你会得到正确的东西。
或者你可以把等边案放在等腰案之前,但那是不好的做法。明确总是好于隐含。