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

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

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

 
 Ответить  Открыть новую тему 
> Одномерный массив - вроде бы просто?
сообщение
Сообщение #1


Гость






Ребят помогите пожалуйста, второй день голову ломаю, что-то никак не выходит!
Найти три наименьших по значению элемента одномерного массива (равные не учитывать) целых чисел, введеных с клавы. Заменить их на соответствующие им индексы.
Спасибо
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


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

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

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


Вот такой код, вроде, должен работать (не проверял).
M:=1;  { Общее число минимальных элементов }
for j:=1 to 3 do begin { подготовка массивов минимальных элементов и номеров }
Min[j]:=a[1];
iMin[j]:=1
end;
for i:=2 to N do
for j:=1 to 3 do if a[i]<Min[j] then begin { найден новый минимальный элемент }
for k:=j to 2 do begin { сдвигаем массив минимальных элементов вместе с индексами }
Min[k+1]:=Min[k];
iMin[k+1]:=iMin[k]
end;
Min[j]:=a[i];
iMin[j]:=i;
if (M=j) and (M<3) then Inc(M) { увеличиваем число минимальных элементов }
Break
end;
for j:=1 to M do a[iMin[j]]:=iMin[j]; { замена минимальных элементов на их индексы }



Добавлено через 6 мин.
Однако, нет.. sad.gif
Уже нашел ошибку. В ситации 1, 2, 3, 4 - результат будет неверный.
Сейчас попробую исправить...


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


Perl. Just code it!
******

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

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


const
n = 4;
type
TArray = array [1..n] of Integer;
TMinArray = array [1..3] of Integer;

const
A: TArray = (5, 2, 1, 3);

var
i, j, min: Integer;
M: TMinArray;

begin

for j := 1 to 3 do begin
min := 1;
for i := 2 to n do
if (A[i] < A[min]) and ((j = 1) or (A[i] > A[M[j - 1]])) then
min := i;
M[j] := min;
end;


for i := 1 to 3 do A[M[i]] := M[i];
end.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


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

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

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


Да, схема Klem4 лучше.. smile.gif
Свою я исправил (надо изначально заполнять массив минимумов максимальным элементом), но мусорить ей не хочу.

Но, Клем, у тебя все же есть ошибка.. yes2.gif Примерно такая же, как та, что я у себя исправлял. Нельзя на втором и третьем проходе брать первый номер в качестве начального.


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


Гость






'klem4' - огромное спасибо, всё работает!
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






а может лучше выложить Ваш код?
очень интересно...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


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

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

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


И еще одна: надо подсчитывать количество минимумов и распечатывать не все три элемента массива, а только найденные.

Все же я приведу тут свой исправленный вариант. Он отличается тем, что поиск производится за один проход.
(Не проверено!)
  Max:=a[1];
iMax:=1;
for i:=2 to N do if a[i]>Max then begin { находим максимальный элемент }
Max:=a[i];
iMax:=i
end;
M:=1; { Общее число минимальных элементов }
for j:=1 to 3 do begin { подготовка массивов минимальных элементов и номеров }
Min[j]:=Max;
iMin[j]:=iMax
end;
for i:=2 to N do
for j:=1 to 3 do if a[i]<Min[j] then begin { найден новый минимальный элемент }
for k:=j to 2 do begin { сдвигаем массив минимальных элементов вместе с индексами }
Min[k+1]:=Min[k];
iMin[k+1]:=iMin[k]
end;
Min[j]:=a[i];
iMin[j]:=i;
if (M=j) and (M<3) then Inc(M) { увеличиваем число минимальных элементов }
Break
end;
for j:=1 to M do a[iMin[j]]:=iMin[j]; { замена минимальных элементов на их индексы }


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


Гость






помоему код klem4 проще и понятней, а особых изысков не нужно, думаю преподаватель не поймет smile.gif
Все равно ОГРОМНОЕ СПАСИБО !
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


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

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

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


Цитата(Гость @ 14.03.2007 11:32) *

помоему код klem4 проще и понятней, а особых изысков не нужно, думаю преподаватель не поймет smile.gif
Все равно ОГРОМНОЕ СПАСИБО !

Согласен, я выше об этом уже сказал smile.gif. Правда, в моем тоже можно сделать упрощение: убрать массив минимумов, оставить только индексы (подсмотрено у Клема, сам почему-то не догадался smile.gif).
Вот так:
  Max:=1;
for i:=2 to N do if a[i]>Max then Max:=i; { находим максимальный элемент }
M:=1; { Общее число минимальных элементов }
for j:=1 to 3 do Min[j]:=Max { подготовка массива номеров минимальных элементов }
for i:=2 to N do
for j:=1 to 3 do if a[i]<a[Min[j]] then begin { найден новый минимальный элемент }
for k:=j to 2 do Min[k+1]:=Min[k];
Min[j]:=i;
if (M=j) and (M<3) then Inc(M); { увеличиваем число минимальных элементов }
Break
end;
for j:=1 to M do a[Min[j]]:=Min[j]; { замена минимальных элементов на их индексы }

А что касается сдачи кода с ошибками - твое дело.. Сам исправить не можешь?


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


Гость






Я бы сделал вот это (для общего случая, а не только для трех минимумов):
const
n = 11;
m = 3;

type
arrType = array[1 .. n] of integer;
minType = array[1 .. m] of integer;

const
a: arrType = (1, 2, 3, 4, 3, 2, 7, 6, 3, 3, 1);

var
found: boolean;
mins: minType;
i, j, k: integer;

begin
for i := 1 to m do mins[i] := -1;

for i := 1 to n do begin

{ Проверяем, было ли это значение уже обработано }
found := false;
for j := 1 to m do
if (mins[j] <> -1) and (a[i] = a[mins[j]]) then found := true;

{ если было - берем следующее }
if found then continue;

{ а тут, собственно, заполняем массив минимумов }
j := 1;
while (j <= m) and (mins[j] <> -1) and (a[mins[j]] < a[i]) do inc(j);
if j <= m then begin
for k := m downto j + 1 do mins[k] := mins[k - 1];
mins[j] := i;
end;

end;

{ и меняем индексы }
for i := 1 to m do
if mins[i] <> -1 then a[mins[i]] := mins[i];

end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


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

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

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


Пока смотрел код volvo, нашел еще одну ошибку у себя.. smile.gif
Ну и, заодно, переделал на случай поиска произвольного количества минимумов (L) smile.gif

L:=3;
Max:=1;
for i:=2 to N do if a[i]>Max then Max:=i; { находим максимальный элемент }
M:=1; { Общее число минимальных элементов }
for j:=1 to L do Min[j]:=Max { подготовка массива номеров минимальных элементов }
for i:=2 to N do
for j:=1 to L do if a[i]<a[Min[j]] then begin { найден новый минимальный элемент }
for k:=L-1 downto j do Min[k+1]:=Min[k];
Min[j]:=i;
if (M=j) and (M<L) then Inc(M); { увеличиваем число минимальных элементов }
Break
end;
for j:=1 to M do a[Min[j]]:=Min[j]; { замена минимальных элементов на их индексы }


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


Perl. Just code it!
******

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

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


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


У меня то учитывается:

Цитата
if (A[i] < A[min]) and ((j = 1) or (A[i] > A[M[j - 1]])) then


Единственное можно еще опставить
{$B-}


Или о чем ты ? Поясни, в каком случае будет ошибка.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


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

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

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


Проверь на массиве 1, 2, 3, 4
Твоя прога выдает индексы: 1, 1, 1

Добавлено через 5 мин.
Посмотри - я тоже сначала засовывал в минимумы первый элемент.
А потом сделал так: сначала нахожу максимальный элемент, и его использую как начальный.
В твоем случае нужно примерно так:
  Max :=1;
for i:=2 to n do if a[i]>a[Max] then Max:=i;
for j := 1 to 3 do begin
min := Max;

Или предложи другой выход..


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


Perl. Just code it!
******

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

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


Действительно, тогда вот что сочинил:

for j := 1 to 3 do begin

i := 1; min := 1;

if j > 1 then begin
while (i <= n) and (A[i] <= A[M[j - 1]]) do inc(i);
min := i;
i := i + 1;
end;

while (i <= n) do begin
if ((j = 1) and (A[i] < A[min])) OR (j > 1) and (A[i] < A[M[j - 1]]) then
min := i;
inc(i);
end;

M[j] := min;

end;


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


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

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

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


Цитата(klem4 @ 14.03.2007 13:09) *

Действительно, тогда вот что сочинил:

Можно и так smile.gif
Только исправь строчку:
      while (i < n) and (A[i] <= A[M[j - 1]]) do inc(i); { убрано равентсво }

- иначе вылетает за пределы массива, если все его элементы равны.

Но все же надо как-то считать, сколько минимумов найдено - иначе не разберешься в результатах (например, проверь на 1, 1, 1, 1).. Или, как volvo, по признаку (-1) ..


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

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

 





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