Pascal

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

Pascal

Сообщение NT » 20 ноя 2010, 21:12

B принципе, если вы хотите печатать весь массив как у вас было - c нулями,
то изменения введите только это:
if max <= A[i] then begin max:=A[i]; /* Повторы Макса */

PS. Улучшения были продиктованы тем, чтобы не печатать удалённых элементов,
согласно вашим первоначальным условиям - "удалить из массива все максимальные элементы".
Последний раз редактировалось NT 29 ноя 2019, 12:59, всего редактировалось 1 раз.
Причина: test

Thomas
Сообщений: 312
Зарегистрирован: 16 окт 2009, 21:00

Pascal

Сообщение Thomas » 21 ноя 2010, 05:24

Спасибо.
Сейчас буду разбираться
Последний раз редактировалось Thomas 29 ноя 2019, 12:59, всего редактировалось 1 раз.
Причина: test

Thomas
Сообщений: 312
Зарегистрирован: 16 окт 2009, 21:00

Pascal

Сообщение Thomas » 21 ноя 2010, 05:37

я сделал как вы написали.
Теперь все элементы равные макс удаляет.но вместе c этими элементыми еще элемент или элементы не макс.но не всегда иногда все нормально работает.
и если макс число стоит 1вым он его не удаляет.
Последний раз редактировалось Thomas 29 ноя 2019, 12:59, всего редактировалось 1 раз.
Причина: test

СергейП
Сообщений: 4145
Зарегистрирован: 17 июл 2009, 21:00

Pascal

Сообщение СергейП » 21 ноя 2010, 09:25

1. Нельзя одновременно (в одном цикле) искать max и удалять (обнулять, :=-99 и т.д) его.
Сначала нужен отдельный цикл поиска max, a уже затем второй цикл - удалять (или ...)
2. B процедуре Delete надо оставить что-нибудь одно - или сдвиг или присвоение -99, одновременно это явный перебор.
Последний раз редактировалось СергейП 29 ноя 2019, 12:59, всего редактировалось 1 раз.
Причина: test

Thomas
Сообщений: 312
Зарегистрирован: 16 окт 2009, 21:00

Pascal

Сообщение Thomas » 21 ноя 2010, 12:48

весь день просидел вот что получилось:
Const n=15;
Type mas=array[1..n] of integer;
var
a:mas;
k,i,max:integer;

Procedure Print(z:mas; m: integer);
var i:integer;
Begin
for i:=1 to m do
write(z[i],' ');
writeln;
end;

Procedure Delet(pmax:integer; var m: integer);
var
i,j: integer;
Begin
m:=n;
for i:=n downto 1 do
if pmax=a[i] then begin
for j:=i to m-1 do
a[j]:=a[j+1];
a[m]:=0;
end;
end;

Begin

randomize;
for i:=1 to n do
a[i]:=random(20)-10;

Print(a,n);

Max:=A[1];

for i:=2 to n do
if max
Последний раз редактировалось Thomas 29 ноя 2019, 13:00, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

Pascal

Сообщение NT » 21 ноя 2010, 13:31

Вот вариант, где нет сдвига, повторные Макс просто "удаляются".

Код: Выбрать все

 Program massiv;
Const n=15;
Type mas=array[1..n] of integer;
var
a:mas;
k,i,max:integer;

Procedure Print(z:mas);
var i:integer;
Begin
for i:=1 to n do
 if z[i]> -99 then write(z[i],' '); /* Выводить только неудалённые элементы*/
writeln;
end;

Procedure Delet(k:integer);
a[k]:=-99; /* Отметить, что элемент удалён */
end;

Begin
randomize;
for i:=1 to n do
a[i]:=random(20)-10; /* значения (-10 ... 10)*/
Print(a);
Max:=A[1];
for i:=2 to n do
 begin
 if max < A[i] then max:=A[i]; /* New Max*/
 else if max = A[i] then Delet(i); /* Повторы Макса удалять */
 end;
end;
writeln(max);
Print(a);
readln;
end.
Последний раз редактировалось NT 29 ноя 2019, 13:00, всего редактировалось 1 раз.
Причина: test

СергейП
Сообщений: 4145
Зарегистрирован: 17 июл 2009, 21:00

Pascal

Сообщение СергейП » 21 ноя 2010, 13:47

NT писал(а):Source of the post Вот вариант, где нет сдвига, повторные Макс просто "удаляются".
Одно исправлено, но c max все еще не верно.
Например, если будет массив 1,1,2,2,3,3,4,4,5,5, то после работы программы получится 1,-99,2,-99,3,-99,4,-99,5,-99, что явно не то, что нужно.
Одним циклом не обойтись - сначала в первом цикле надо просто найти max, a уже потом, во втором, все элементы равные max заменить на -99
Последний раз редактировалось СергейП 29 ноя 2019, 13:00, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

Pascal

Сообщение NT » 21 ноя 2010, 13:55

Ok.
Да два цикла надо делать, проглядел этот момент.

Код: Выбрать все

...
Max:=A[1]; /* Макс */
k := 1; /* позиция Макса */
for i:=2 to n do begin
 if max < A[i] then begin
 max:=A[i]; /* New Max*/
 k := i; /* Запомнить новую позицию Макса */
 end;
end;


for i:=1 to n do
 if max = A[i] then Delet(i); /* Повторы Макса удалять */

a[k] := max; /* Переписать Мах на первую позицию */

writeln(max);
Print(a);
readln;
end.

Дальше надеюсь сами.
Последний раз редактировалось NT 29 ноя 2019, 13:00, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 3 гостей