Комплексное сравнение в C - PullRequest
0 голосов
/ 10 июня 2018

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

#include <stdio.h> 
int compare(int a, int b, int c){
    if(a-b>0&&a-c>0)
        return c;
    else
        if (b-c>0)
        return a;//what would it return?
    else
        return b;

}
int main()
{//below in printf? is it right to print this way?
    printf("%d",compare(compare(88,89,91)compare(90,41,17)compare(75,100,96)));
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

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

int compare(int a, int b, int c){
    if(a > b && a > c)
        return c;
    else
        if (b > c)
        return a;
    else
        return b;
}

Теперь правила просты:

  • Если a не более трех, вернуть c
  • Если b не более трех, вернуть a
  • Если c не более трех, return b

Этот набор правил позволяет выводить выходные данные для всех имеющихся случаев.

0 голосов
/ 10 июня 2018

После публикации код не компилируется, поскольку в списке аргументов printf отсутствуют запятые.

Вот исправленная версия с дополнительным интервалом для улучшения читабельности:

#include <stdio.h> 

int compare(int a, int b, int c) {
    if (a - b > 0 && a - c > 0)
        return c;
    else
    if (b - c > 0)
        return a;//what would it return?
    else
        return b;
}

int main() {
    //below in printf? is it right to print this way?
    printf("%d\n", compare(compare(88, 89, 91),
                           compare(90, 41, 17),
                           compare(75, 100, 96)));
    return 0;
}

Этот код кажется нарушенным во многих отношениях, за исключением первоначальных синтаксических ошибок:

  • a - b > 0 выполняет целочисленное вычитание, которое может переполниться: знаковое арифметическое переполнение определено как имеющее неопределенное поведение в стандарте C.Было бы проще и безопаснее написать a > b, который определен для всех значений a и b.
  • compare(a, b, c), возвращает c, если a является наибольшим значением, a если b является наибольшим и b, если c является наибольшим ... Следовательно, результат сильно зависит от порядка заданных параметров.Можно задаться вопросом, а не было ли намерение вычислить максимальное значение триплета вместо этого, которое не будет зависеть от порядка параметров.

Интересно, что действительно ожидается от кандидата, столкнувшегося с этим тестом.

...