2013-09-02 2 views
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; 
} 

однако им получать реальный нечетные выходы, как это:

enter image description here

я знаю, что с помощью быстрой сортировки что-то вроде этого является излишним, но я хотел держите его коротким и используйте компараторы, просто для удовольствия.

Редактировать: iv добавлен полный код и проверили компаратор, чтобы проверить наличие поплавков, но все равно получить тот же результат.

+1

Дайте нам «основной» код, где вы фактически называете эти функции. – Yuushi

+1

Как вы называете функцию 'checkTriangles'? В чем аргумент? Как объявляется аргумент? И каковы его ценности? Возможно, вы захотите сделать [SSCCE] (http://sscce.org/). Кроме того, предупреждающие сообщения от компилятора * важны *, поскольку они обычно указывают, что вы делаете что-то не так, поэтому, пожалуйста, отредактируйте свой вопрос, чтобы включить их также (как текст, а не как скриншот). –

+0

предоставляется. я хотел предоставить все это, но я получил предупреждение. Надеюсь, теперь это поможет. – Somjit

ответ

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]); 

Примечание: Там нет необходимости продолжать использовать указатель разыменования, то есть массив, так почему бы не использовать синтаксис массива?

+0

Спасибо. должен был это заметить. Задача решена. :) – Somjit

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

И тогда, когда вы даете равносторонний треугольник, вы получите правильные вещи печати.

В качестве альтернативы вы могли бы просто поставить равносторонний чехол перед равнобедренным корпусом, но это было бы плохой практикой. Явный всегда лучше, чем неявный.

+0

спасибо, что указал. Но моя главная проблема заключается в том, что он дает мне действительно странные результаты – Somjit

Смежные вопросы