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

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

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

 
 Ответить  Открыть новую тему 
> Нахождение min и max в массиве
Вячеслав Л.
сообщение 27.10.2009 17:35
Сообщение #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 
 К началу страницы 
+ Ответить 
ammaximus
сообщение 27.10.2009 18:11
Сообщение #2


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

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

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


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

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

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



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


Бывалый
***

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

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


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

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

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

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


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


Гость






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

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





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

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


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

зачем после присваивания минимуму первого лемента сразу сравниваем его с первым элементом no1.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Вячеслав Л.
сообщение 28.10.2009 14:44
Сообщение #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 
 К началу страницы 
+ Ответить 
Lapp
сообщение 29.10.2009 3:31
Сообщение #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 
 К началу страницы 
+ Ответить 
Lapp
сообщение 29.10.2009 3:59
Сообщение #8


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

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

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


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

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


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


Гуру
*****

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

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


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


Гость






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

Да и про негативное влияние на производительность при работе с индексами - тоже бабушка надвое сказала. Как ты же сам говорил?
Цитата
Ты хочешь конкретный совет, как можно решить проблему, или просто поговорить о несовершенстве Вселенной?
Вот со мной о несовершенстве сферического компилятора в вакууме говорить не надо. Цифры и коды в студию. А я еще и посмотрю, выполняется ли то, о чем ты напишешь, на МОЕЙ машине (прецеденты, к сожалению, уже были, мне на Сурсах уже один раз говорили, что мой код работает медленнее, чем другой. Оказалось, что на древнем 386 процессоре)
 К началу страницы 
+ Ответить 
Вячеслав Л.
сообщение 29.10.2009 14:44
Сообщение #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 
 К началу страницы 
+ Ответить 
Lapp
сообщение 29.10.2009 15:15
Сообщение #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 
 К началу страницы 
+ Ответить 
Вячеслав Л.
сообщение 29.10.2009 16:54
Сообщение #13


Бывалый
***

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

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


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


--------------------
Само знание есть сила
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 29.10.2009 22:35
Сообщение #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 
 К началу страницы 
+ Ответить 
Lapp
сообщение 30.10.2009 0:10
Сообщение #15


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

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

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


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

Флуд все это.


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

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

 



- Текстовая версия 24.04.2024 12:29
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"