Нахождение максимального целого числа из трех целых чисел в C

#c

#c

Вопрос:

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

Может ли кто-нибудь более опытный помочь мне объяснить; почему мне нужно разрешить max = 0, чтобы программа функционировала?

 #include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main()
{
  int size, max;
  int arr[3];

  for (int i = 0; i < 3; i  ) {
    printf("Please enter your integer:n");
    scanf("%d", amp;arr[i]);
  } 

  max = 0;

  for (int i = 0; arr[i] >= max; i  ) {
    max = arr[i];
  }

  printf("This is the max number: %d", max);

  return 0;
}
 

Всем спасибо за помощь.

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

1. Ну, просто потому, что вы тестируете против него, ему нужно начальное значение. Однако оно не должно быть равно нулю, оно должно быть INT_MIN вместо этого. Кроме того, ваша программа выдаст неверный результат с входной последовательностью, такой как, 3, 1, 7. Выяснение причины остается для читателя в качестве домашнего задания. 🙂

2. Подумайте о своем алгоритме. Каким будет результат, если все входные значения являются отрицательными числами? Подсказка: если вы инициализируете Max равным 0, то все введенные числа будут меньше Max.

Ответ №1:

Правильный цикл будет:

 int max= INT_MIN;
for (int i = 0; i<3; i  )
   if (arr[i]> max) max= arr[i];
 

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

1. ноль в качестве начального значения приведет к неправильным результатам с отрицательными входными данными.

2. Возможно, стоит добавить примечание, чтобы включить ограничения. h для определения INT_MIN .

3. Будет ли правильно, если я инициализирую? int max = arr [0];

4. Да, это было бы правильно. Затем вы можете запустить цикл i=1 .

5. @vmt, потому что, если это не max, то будет найдено другое значение max.

Ответ №2:

Прежде всего, ваш код не найдет правильного ответа во всех тестовых примерах, и это из-за того, как вы написали свой второй for цикл. Например, если у вас есть ввод like 3, 2, 4 , после первой итерации for у вас будет max = 3 и цикл for остановится, потому что следующий элемент (2) меньше текущего max (3) . Но максимальное значение этого массива равно 4, а не 3. Вы должны изменить второй цикл for следующим образом:

 for (int i=0;i<3;i  ) {
     (if array[i]>max) max = array[i]; 
}
 

Кроме того, обратите внимание, что вы можете инициализировать max значение 0, только если у вас нет отрицательных чисел в массиве, в противном случае вы можете получить неправильные результаты. Итак, если вы не можете делать предположения о своих входных значениях, я бы посоветовал вам просто инициализировать max первый элемент массива и выполнить цикл, начиная со второго и заканчивая концом (for(i=1;i<3;i ) .

Ответ №3:

Переменная должна быть инициализирована, прежде чем ее можно будет использовать. Первое использование max :

 for (int i = 0; arr[i] >= max; i  ) {
    ...         ^^^^^^^^^^^^^
}
 

Граничное условие в for цикле (т.Е. arr[i] >= max ) вычисляется перед каждой итерацией цикла. max Поэтому перед выполнением тела цикла требуется значение for .

Таким образом, вы должны присвоить некоторое значение max вне цикла и, как вы обнаружили, max = 0 является подходящим начальным значением для некоторых входных данных.

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

 max = 0;
for (int i = 0; i < 3; i  ) {
    if (arr[i] > max) {
        max = arr[i];
    }
}
 

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

1. Но этот цикл завершается, когда нет arr[i] >= max , и когда i== 1, тогда значения i == 2 не вычисляются: неправильное условие цикла!

2. @PaulOgilvie Вы правы; Я был сосредоточен на главном вопросе и полностью пропустил это!

Ответ №4:

Если это только для трех:

 #define MAX_SIMPLE(a, b) (((a) > (b)) ?(a) :(b))

int a[3] = {3, 2, 1};

printf("max is: %dn", MAX_SIMPLE(a[0], MAX_SIMPLE(a[1], a[2])));
 

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

1. Можете ли вы помочь объяснить, что делает этот код? #define MAX_SIMPLE(a, b) (((a) > (b)) ?(a) :(b))