IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Нахождение min и max в массиве
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 227
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  3  +


Чему должно присваиваться значения 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}


--------------------
Само знание есть сила
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


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

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

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



--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 227
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  3  +


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

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

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

Такой вариант считаю неправильным. Причина - не универсальность.


--------------------
Само знание есть сила
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

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





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Вадим

Репутация: -  0  +


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

зачем после присваивания минимуму первого лемента сразу сравниваем его с первым элементом no1.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 227
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  3  +


Цитата
Кто бы говорил про универсальность
Что ты имеешь в виду?

Цитата
зачем после присваивания минимуму первого лемента сразу сравниваем его с первым элементом
Нда, простите, это действительно было глупо 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.
Или я опять не прав?







--------------------
Само знание есть сила
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Вячеслав Людской @ 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 .


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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

Константы есть, да - но все же не мешает помнить, что границы диапазона -32768 и 32767, а не как ты написал..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Цитата(Lapp @ 29.10.2009 3:31) *
1. Запоминай не сам минимум, а его индекс.
А почему?
Я бы, например, не стал рекомендовать исправления, которые могут негативно сказаться на производительности. Тем более в том месте, которое может существенно повлиять на время выполнения программы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Цитата
Я бы, например, не стал рекомендовать исправления, которые могут негативно сказаться на производительности.
Если не внести это исправление, то вполне возможно (и даже вероятнее всего), что это скажется на производительности отрицательно. Миром byte, integer и longint, andriano, реальные программы не ограничены. Вот понадобится мне работать со своим типом данных, размером байт в 500-700, и что?

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


Бывалый
***

Группа: Пользователи
Сообщений: 227
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  3  +


Так получается?

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.


--------------------
Само знание есть сила
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Зачем ты присваиваешь 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) *
А почему?
Я бы, например, не стал рекомендовать исправления, которые могут негативно сказаться на производительности. Тем более в том месте, которое может существенно повлиять на время выполнения программы.
Что за спешка? Когда человеку потребуется скорость - тогда будет выжимать все возможное. Пока же такой цели не ставилось.
Когда спрашивается про "макс/мин элемент массива", я всегда сомневаюсь, что же именно хотят: его значение или индекс. Предпочитаю быть готовым ко всему.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Бывалый
***

Группа: Пользователи
Сообщений: 227
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  3  +


Я до этого не додумался, думал все равно надо i:=1. Код посмотрел, спасибо большое за помощь.


--------------------
Само знание есть сила
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Цитата(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) *
Когда человеку потребуется скорость - тогда будет выжимать все возможное. Пока же такой цели не ставилось.
Ну да, сначала научим человека программировать, а потом будем переучивать программировать правильно...
Цитата

Когда спрашивается про "макс/мин элемент массива", я всегда сомневаюсь, что же именно хотят: его значение или индекс. Предпочитаю быть готовым ко всему.
Да, тяжело решать задачу, смысла которой не понимаешь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(andriano @ 29.10.2009 22:35) *
Видишь ли, ... не понимаешь.

Флуд все это.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






Fluconazole 200 Mg Yeast Infection
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Viagra Pfizer Presentacion
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 22.11.2024 20:08
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name