#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))