0

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

我的代码:

#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 添加了完整的代码,并检查了比较器以检查浮点数,但仍然得到相同的输出。

4

2 回答 2

6

这是一个未定义行为的大问题:

printf("\n%f\n%f\n%f\n", num , num + 1 , num + 2);

在这里,您使用指向调用中的值的指针printf,但您应该使用values

更改为例如

printf("\n%f\n%f\n%f\n", num[0], num[1], num[2]);

注意:没有必要继续使用指针解引用,你有一个数组那么为什么不使用数组语法呢?

于 2013-09-02T09:12:32.593 回答
2

if条件:

else if(a==b || b==c || c==a){
    printf("isosceles triangle");
}

等腰三角形和等边三角形的计算结果为真 - 当您通过a = 5, b = 5, c = 5,此 if 条件时,计算结果为真并打印等腰三角形。你想要这样的东西:

else if( (a==b || b==c || c==a) && !(a==b && a==c){
    printf("isosceles triangle");
}

然后当你给出一个等边三角形时,你会得到正确的打印结果。

或者,您可以将等边情况放在等腰情况之前,但这是不好的做法。显式总是比隐式好。

于 2013-09-02T09:16:29.460 回答