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

C 确定三角形类型的简单程序,给出奇怪的结果,c,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;

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

我的代码:

#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;
}
#包括
#包括
int比较器(常量无效*elem1,常量无效*elem2){
int f=*((浮点*)elem1);
int s=*((浮点*)elem2);
如果(f>s)返回1;
如果(fc))则为else{
printf(“法线三角形”);
}
否则{
printf(“无效”);
}
}
内部主(空){
字符c='a';
char-str[12];
float num[3];
而(c!='q'){
printf(“\n\n在两侧输入:”);
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);
方格三角形(num);
printf(“\n输入q以退出..任何其他以继续:”;
c=getchar();
}
返回0;
}
然而,我得到了这样的奇数输出:

我知道对这样的东西使用快速排序是过分的,但我想保持它的简短,并且也使用比较器,只是为了好玩


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

这里有一个大问题,即未定义的行为:

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]);
注意:无需继续使用指针解引用,您有一个数组,为什么不使用数组语法?

如果条件:

else if(a==b || b==c || c==a){
    printf("isosceles triangle");
}
对于等腰三角形和等边三角形,将求值为真-当您通过
a=5、b=5、c=5时,
如果条件求值为真并且打印等腰三角形,则此条件将求值为真。你想要的是:

else if( (a==b || b==c || c==a) && !(a==b && a==c){
    printf("isosceles triangle");
}
然后当你给出一个等边三角形,你会得到正确的东西


或者,你可以把等边的情况放在等腰的情况之前,但那是一个糟糕的做法。显式总是比隐式好。

给我们提供实际调用这些函数的
main
代码。如何调用
checkTriangles
函数?争论是什么?这个论点是如何表述的?它的价值是什么?你可能想做一个决定。此外,来自编译器的警告消息也很重要,因为它们通常表示您做错了什么,所以请编辑您的问题,将它们也包括在内(以及文本,而不是屏幕截图)。您的比较器比较整数,而不是浮点数。您的num[]数组是float类型,因此您需要编写比较器函数来比较浮点数,不是ints。@AlexFarber很抱歉!我错过了检查那部分。原始代码是用于ints的。感谢您指出这一点。但我的主要问题是它给了我非常奇怪的输出