确定三角形类型的简单程序给出了奇怪的结果

时间:2013-09-02 08:59:10

标签: c

该程序检查简单的三角形类型:等边,等腰,直角等。但我得到了非常奇怪的结果。

我的代码:

#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;
}

然而,我得到像这样的真正的奇数输出:

enter image description here

我知道使用快速排序这样的东西是矫枉过正,但我​​想保持简短并使用比较器,只是为了好玩。

编辑:iv添加完整代码,并检查比较器以检查浮动,但仍然获得相同的输出。

2 个答案:

答案 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");
}

然后当你给出一个等边三角形时,你会得到正确的东西。

或者你可以把等边案放在等腰案之前,但那是不好的做法。明确总是好于隐含。