Помощь - Поиск - Пользователи - Календарь
Полная версия: Нахождение min и max в массиве
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Вячеслав Л.
Чему должно присваиваться значения min и max для программы нахождения максимального числа или минимального числа в массиве? То есть, меня интересует инициализация min и max до цикла. Ведь, по идеи чтобы найти max элемент мы должны первый элемент присвоить какому-то max, затем проверить если какой-то следующий элемент будет больше, чем тот который мы задали, тогда max присвоить этому элементу и т. д. (то есть все это в цикле)
...
max:integer;
...
max:=a[1];
for i:=1 to n do
if a[i]>max then max:=a[i];
...

То же самое для минимального:
...
min:integer;
...
min:=a[1];
for i:=1 to n do
if a[i]<min then min:=a[i];
...


Также ли надо было присваивать для просто введенных с клавы чисел, для которых нам надо было найти min и/или max? То есть:
...
write('vvedite kolvo 4isel');
readln(n);
{naxodim min i/ili max}
ammaximus
В идеале max = INF, min = -INF т.е. самое большое и самое малое возможное число.
Для переменных - границы (например -32767 и 32768 для integer)

Добавлено через 5 мин.
smile.gif smile.gif smile.gif
Все наоборот
В идеале max = -INF, min = INF т.е. самое малое для максимума и самое большое для минимума возможное число.

Да кстати в паскале есть для этого специальные константы - MaxInt, MaxLongint

Вячеслав Л.
Цитата
идеале max = INF, min = -INF т.е. самое большое и самое малое возможное число.
Для переменных - границы (например -32767 и 32768 для integer)

Добавлено через 5 мин.

Все наоборот
В идеале max = -INF, min = INF т.е. самое малое для максимума и самое большое для минимума возможное число.

Такой вариант считаю неправильным. Причина - не универсальность.
volvo
Цитата
Такой вариант считаю неправильным. Причина - не универсальность.
Кто бы говорил про универсальность dry.gif

А я вот такой вариант считаю неправильным (если уж про универсальность заговорили):
min:=a[1];
for i:=1 to n do
if a[i]<min then min:=a[i];
причина - лишнее действие, которого очень легко избежать. И не только... Но что еще - это тебе задание на дом...
Error 205
min:=a[1];
for i:=2 to n do
if a[i]<min then min:=a[i];
.

зачем после присваивания минимуму первого лемента сразу сравниваем его с первым элементом no1.gif
Вячеслав Л.
Цитата
Кто бы говорил про универсальность
Что ты имеешь в виду?

Цитата
зачем после присваивания минимуму первого лемента сразу сравниваем его с первым элементом
Нда, простите, это действительно было глупо yes2.gif

Цитата
И не только... Но что еще - это тебе задание на дом...
Да же не знаю, что еще не так... С дом. заданием я не справился... nea.gif

И все же по-моему такой вариант наиболее правильный:
var
a:array[1..100] of integer;
i,min:integer;
begin

for i:=1 to 5 do
readln(a[i]);

min:=a[1];
for i:=2 to 5 do
if a[i]<min then min:=a[i];

writeln('min element ',min);

end.
Или я опять не прав?





Lapp
Цитата(Вячеслав Людской @ 28.10.2009 14:44) *
И все же по-моему такой вариант наиболее правильный:
var
a:array[1..100] of integer;
i,min:integer;
begin

for i:=1 to 5 do
readln(a[i]);

min:=a[1];
for i:=2 to 5 do
if a[i]<min then min:=a[i];

writeln('min element ',min);

end.
Или я опять не прав?

Извиняюсь за встревание.. Если говорить о "наиболее правильном" варианте, то все же не так.

1. Запоминай не сам минимум, а его индекс. Соответственно, измени инициализацию, сравнение и вывод. Это повысит ту самую универсальность, о которой ты говорил.

2. Убери явное использование чисел из верхних границ циклов. Используй переменные или константы.

3. Пока ты не научишься нормально форматировать код, я бы на месте твоего преподавателя ставил не больше тройки. Считаю это ошибкой, причем грубой.

Итого: двойка yes2.gif .
Lapp
Цитата(ammaximus @ 27.10.2009 18:11) *
Для переменных - границы (например -32767 и 32768 для integer)
...
Да кстати в паскале есть для этого специальные константы - MaxInt, MaxLongint

Константы есть, да - но все же не мешает помнить, что границы диапазона -32768 и 32767, а не как ты написал..
andriano
Цитата(Lapp @ 29.10.2009 3:31) *
1. Запоминай не сам минимум, а его индекс.
А почему?
Я бы, например, не стал рекомендовать исправления, которые могут негативно сказаться на производительности. Тем более в том месте, которое может существенно повлиять на время выполнения программы.
volvo
Цитата
Я бы, например, не стал рекомендовать исправления, которые могут негативно сказаться на производительности.
Если не внести это исправление, то вполне возможно (и даже вероятнее всего), что это скажется на производительности отрицательно. Миром byte, integer и longint, andriano, реальные программы не ограничены. Вот понадобится мне работать со своим типом данных, размером байт в 500-700, и что?

Да и про негативное влияние на производительность при работе с индексами - тоже бабушка надвое сказала. Как ты же сам говорил?
Цитата
Ты хочешь конкретный совет, как можно решить проблему, или просто поговорить о несовершенстве Вселенной?
Вот со мной о несовершенстве сферического компилятора в вакууме говорить не надо. Цифры и коды в студию. А я еще и посмотрю, выполняется ли то, о чем ты напишешь, на МОЕЙ машине (прецеденты, к сожалению, уже были, мне на Сурсах уже один раз говорили, что мой код работает медленнее, чем другой. Оказалось, что на древнем 386 процессоре)
Вячеслав Л.
Так получается?

var
a:array[1..100] of integer;
i,n,min:integer;
begin
writeln('vvedite koli4estvo elementov massiva');
readln(n);
for i:=1 to n do
readln(a[i]);
i:=1;
min:=a[i];
for i:=2 to n do
if a[i]<min then min:=a[i];
writeln('min element ',min);
end.
Lapp
Зачем ты присваиваешь i единицу?.. Единицу надо присваивать min'у. При этом min превращается в индекс. Вот так:

min:=1;
for i:=2 to n do if a[i]<a[min] then min:=i;
writeln('min element is: a[',min,']=',a[min]);

Кроме самого кода, постарайся отсюда выудить максимум рекомендаций по форматированию.


Добавлено через 6 мин.
Цитата(andriano @ 29.10.2009 9:00) *
А почему?
Я бы, например, не стал рекомендовать исправления, которые могут негативно сказаться на производительности. Тем более в том месте, которое может существенно повлиять на время выполнения программы.
Что за спешка? Когда человеку потребуется скорость - тогда будет выжимать все возможное. Пока же такой цели не ставилось.
Когда спрашивается про "макс/мин элемент массива", я всегда сомневаюсь, что же именно хотят: его значение или индекс. Предпочитаю быть готовым ко всему.
Вячеслав Л.
Я до этого не додумался, думал все равно надо i:=1. Код посмотрел, спасибо большое за помощь.
andriano
Цитата(volvo @ 29.10.2009 9:34) *

Если не внести это исправление, то вполне возможно (и даже вероятнее всего), что это скажется на производительности отрицательно. Миром byte, integer и longint, andriano, реальные программы не ограничены. Вот понадобится мне работать со своим типом данных, размером байт в 500-700, и что?
Видишь ли, volvo, универсального решения пригодного на все случаи жизни, в природе не существует. Я, например, не видел автомобиля, пригодного для того, чтобы развозить пицу по узеньким улочкам, использовать в качестве карерного самосвала, а также для перевозки пассажиров.
С программаи чуть проще - как оно там внутри устроено, никто не видит, а несколькомегагерцовый процессор в большинстве случаев зажует любую неоптимальность, что не заметишь. Правда, не всегда. Особенно, если данная неоптимальность угнездилась в теле самого вложенного цикла.
Увы, сегодня все большую популярность приобретает метод программирования copy/paste, для которого, естественно, универскальность много важнее оптимальности.
Я же консерватор, привык писать код ручками. Поэтому для каждой конкретной задачи выбираю тот путь, который соответствует именно ей, а не как можно более широкому кругу хотя бы отдаленно сходных задач.
Если нужно найти максимум, я ищу ТОЛЬКО максимум. Еслм мне нужен индекс, - ищу индекс (не забывая, правда, заодно запомнить и максимум - чтобы было с чем сравнивать). Ну а если у нас есть структура байт эдак в 500-700, то поступаю по обстановке. Если скажем, у меня есть массив структур, в которых описаны ФИО, год рождения, место работы, тарифный разряд и т.д., и мне нажо найти человека, я буду запоминать индекс. А если мне нужно узнать лишь максимальны рост, то я и буду искать ТОЛЬКО рост.
В подавляющем большинстве случаев операция сравнения на больше/меньше для структур объемом 500-700 байтов не определена. И проводится по некоторому полю этой структуры, тип которого допускает такую операцию. Соответственно, в некоторых случаях (ни в коей мере не утверждаю, что во всех) вполне достаточно запоминать лишь это поле.
Зачем делать лишнюю работу?
Цитата

Да и про негативное влияние на производительность при работе с индексами - тоже бабушка надвое сказала.
Спорить не буду. В том числе и по указанной тобой причине: на разных архитектурах один и тот же код может вести себя по-разному.


Добавлено через 3 мин.
Цитата(Lapp @ 29.10.2009 15:15) *
Когда человеку потребуется скорость - тогда будет выжимать все возможное. Пока же такой цели не ставилось.
Ну да, сначала научим человека программировать, а потом будем переучивать программировать правильно...
Цитата

Когда спрашивается про "макс/мин элемент массива", я всегда сомневаюсь, что же именно хотят: его значение или индекс. Предпочитаю быть готовым ко всему.
Да, тяжело решать задачу, смысла которой не понимаешь.
Lapp
Цитата(andriano @ 29.10.2009 22:35) *
Видишь ли, ... не понимаешь.

Флуд все это.
buy prednisone without a precipi
Fluconazole 200 Mg Yeast Infection
buy priligy on the internet with
Viagra Pfizer Presentacion
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.