У меня таинственный код на C, который ведет себя по-разному в одном и том же тестовом примере, я думаю, что это проблема coodblock - PullRequest
0 голосов
/ 16 марта 2019

Этот код должен давать максимальное число в массиве, но когда я ввожу

4 3 2 1 это даст мне 3 Но если я введу 5 4 3 2, это даст мне 5

Так может ли кто-нибудь сказать мне, почему есть два поведения для одного и того же случая?

int max_of_four(int a, int b, int c, int d){

    int arr[4]= {a,b,c,d};
    int i , j;

    for (i=0 ; i<=3 ;i ++)
    {
        for (j=i+1 ; j<=3 ; j++)
        {
            if (arr[i]>arr[j])
            {
                continue;
            }
            else
               break;
        }
        if (arr[i]>arr[j])
        {
            return arr[i];
        }
    }
    return arr[j];
}

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

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

int max_of_four(int a, int b, int c, int d)
{
    int[] arr= {a,b,c,d};
    int i = 0;

    // set max as the first element in the array
    int max = arr[0];     // arr[0]

    // loop index from 1 to 3
    for (i = 1; i <= 3; i++)
    {
        // if element is greater than current max
        if (arr[i] > max)
            max = arr[i];
    }

    return max;
}

// output
// max_of_four(4,3,2,1):
// 4

// max_of_four(1,5,4,2):
// 5
0 голосов
/ 16 марта 2019

Для вашего внутреннего цикла, если элемент с индексом i является наибольшим значением, то внутренний цикл проходит все значения j от 0 до 3, и j будет 4, когда цикл завершится.Когда вы проверяете arr[i]>arr[j], вы читаете за концом массива, когда j равен 4. Чтение за концом массива вызывает неопределенное поведение , поэтому вы видите противоречивые результаты.

Вместо этого проверьте, равно ли j 4. Если это так, вы знаете, что arr[i] является самым большим.

    for (j=i+1 ; j<=3 ; j++)
    {
        if (arr[i]>arr[j])
        {
            continue;
        }
        else
           break;
    }
    if (j == 4)
    {
        return arr[i];
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...