Я попытался найти самый большой из четырех входов . с помощью C. Но программа не работает

#c

#c

Вопрос:

Приходят разные типы ответов. Иногда код работает. Иногда нет. Я не могу найти решение.

 #include<stdio.h>

 int max_of_four (int a, int b, int c,int d)
   {
    
    if(a>b)
    { 
      if(a>c)
      {
        if(a>d)
        {
          printf("%d",a);
          }
          else
          { 
          printf ("%d", d);
          }
      }
    }
    else if (b>c)
    {
         if (b>d)
         {
            printf ("%d", b);
         }
         else 
         printf ("%d", d);
    }
    else if (c>d)
    {
        printf("%d", c);
    }
    else("%d",d);
    return a, b,c,d;
   }


 int main (void)
    {
      
      int a, b, c, d;
      
      scanf("%d %d %d %d", amp;a, amp;b, amp;c, amp;d);
      
      int ans = max_of_four(a, b, c, d);
      
      printf("%d", and);
    
      return 0;
   }
 

Комментарии:

1. return a, b,c,d; Что это?

2. Как насчет того, чтобы функция возвращала max только два числа? Затем используйте его как max(max(a,b), max(c,d)) . Конечно, будет выглядеть намного чище, может быть, незаметно менее производительным.

3. return a, b, c, d; в основном то же return d; самое, что и (при условии, что ни один из них не объявлен с volatile квалификатором).

4.Вы могли бы использовать переменную: int m = a; if (m < b) m = b; if (m < c) m = c; if (m < d) m = d; return m; .

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

Ответ №1:

Оригинальная версия OP max_of_four не выполняет поиск по всем возможностям. Версия, которая выполняет поиск по всем возможностям, выглядит следующим образом:

 int max_of_four(int a, int b, int c, int d)
{
    if (a > b)
    {
        if (a > c)
        {
            if (a > d)
            {
                return a;
            }
            else
            {
                return d;
            }
        }
        else
        {
            if (c > d)
            {
                return c;
            }
            else
            {
                return d;
            }
        }
    }
    else
    {
        if (b > c)
        {
            if (b > d)
            {
                return b;
            }
            else
            {
                return d;
            }
        }
        else
        {
            if (c > d)
            {
                return c;
            }
            else
            {
                return d;
            }
        }
    }
}
 

Основная проблема такого подхода заключается в том, что объем кода пропорционален 2 степени n-1. Его можно немного уменьшить, внеся некоторые тщательные изменения в поток управления, чтобы избежать повторения идентичных фрагментов кода:

 int max_of_four(int a, int b, int c, int d)
{
    if (a > b)
    {
        if (a > c)
        {
            if (a > d)
            {
                return a;
            }
            else
            {
                return d;
            }
        }
    }
    else
    {
        if (b > c)
        {
            if (b > d)
            {
                return b;
            }
            else
            {
                return d;
            }
        }
    }
    if (c > d)
    {
        return c;
    }
    else
    {
        return d;
    }
}
 

Описанный выше общий метод объединения фрагментов экономит несколько строк кода, но программисту сложнее проверить, что все возможности были учтены, потому что код недостаточно хорошо «структурирован» (в смысле «структурированного программирования»).

Гораздо более простой подход заключается в использовании переменной для отслеживания наибольшего значения. Объем кода, необходимый при таком подходе, пропорционален n:

 int max_of_four(int a, int b, int c, int d)
{
    int m = a;
    if (m < b)
    {
        m = b;
    }
    if (m < c)
    {
        m = c;
    }
    if (m < d)
    {
        m = d;
    }
    return m;
}
 

Ответ №2:

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

 if(a>b) { 
    if(a>c) { 
        if(a>d) { 
            max = a;
...and so on...
 

Затем в конце функции вы возвращаете переменную max , а затем main печатаете ее. (Вы даже можете напечатать значение, max_of_four() но тогда зачем возвращать значение?)

Лучшим способом было бы:

 scanf("%d", amp;max);

for( i = 0; i < 3; i   ) {

    scanf("%d", amp;n);

    if( n > max ) {
        max = n;
    }
}
 

Или вы даже можете использовать массив, если вам нужно что-то делать с входными данными

Ответ №3:

«Иногда код работает. Иногда нет. Я не могу найти решение «.

Логике в вашем коде трудно следовать, что позволяет легко не заметить вклад в логические ошибки.

Чтобы упростить проблему, этот подход инкапсулирует первичную повторяющуюся логику в макрос, а затем вызывает его повторно. (Обратите внимание, что здесь также можно использовать функцию с аналогичными преимуществами с точки зрения очистки кода.)

 //Note: NOT for use with incremented arguments, (eg. MAX(x  , y  ))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))


int max_of_four (int a, int b, int c,int d)
{   
     int max=0;
       
     max = MAX(  a, b);
     max = MAX(max, c);
     max = MAX(max, d);
    
     return max;
}
 

printf() операторы могут быть добавлены обратно, если OP нужно увидеть промежуточные результаты, но пример сохраняется как есть, чтобы подчеркнуть его простоту.