Pascal

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

Pascal

Сообщение Thomas » 20 ноя 2010, 17:31

Помогите пожалуйста c задачей на Паскаль.
Дан одномерный массив удалить из массива все максимальные элементы.
я не знаю как сделать чтобы выводила все элементы.вот что получилось:
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
write(z[i],' ');
wtiteln;
end.
Procedure Delet(k:integer;var z:mas);
var i:integer;
Begin
for i:=k to n-1 do
z[n]:=0;
z[i]:=z[i+1];
end.

Begin
randomize;
fot i:=1 to n do
a[i]:=random(99);
Print(a);
Max:=A[i];
for i:=2 to n do
if max
Последний раз редактировалось Thomas 29 ноя 2019, 12:59, всего редактировалось 1 раз.
Причина: test

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

Pascal

Сообщение NT » 20 ноя 2010, 18:23

Ваша программа :
Program massiv;
Const n=15;
Type mas =array[1..n] of integer; ...
оперирует c массивом постоянной длины N, причём все его элементы > ( не отрицательные числа).
Вместо удаления макс. элемента, введите соглашение - записывать отрицательное число.
T.e. в процедуре Delet, когда находите максимальный элемент,
то на его место запишите отрицательное число - скажем "-99".
A в процедуре Print, печатать только не отрицательные числа.
Вот и всё.
Да проверьте программу, у вас циклы FOR - не правильно обозначены петли,
если несколько операторов должны выполнятся в теле, то надо их обьединять BEGIN ... END.
Последний раз редактировалось NT 29 ноя 2019, 12:59, всего редактировалось 1 раз.
Причина: test

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

Pascal

Сообщение Thomas » 20 ноя 2010, 18:49

T.e. надо заменить например на: a[i]:=random(20)-10;?
У меня теперь такая проблема программа находит максимальное число но если их несколько то выводит только одно.
Последний раз редактировалось Thomas 29 ноя 2019, 12:59, всего редактировалось 1 раз.
Причина: test

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

Pascal

Сообщение NT » 20 ноя 2010, 19:03

T.e. надо заменить например на: a[i]:=random(20)-10;?

Нет.
Заменить на отрицательное число "-99":
a[i]=-99;
У меня теперь такая проблема программа находит максимальное число но если их несколько то выводит только одно.

He понял. B одномерном массиве - всегда одно макс. число,
если несколько элементов равны этому макс. числу, то и так число-то одно,
просто оно приписано нескольким элементам.
A у вас конкретное задание какое?
Удалить все повторяющиеся элементы?
Последний раз редактировалось NT 29 ноя 2019, 12:59, всего редактировалось 1 раз.
Причина: test

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

Pascal

Сообщение Thomas » 20 ноя 2010, 19:12

если мы поменяем на a[i]:=-99 то будут все числа -99 a a[i]:=random(-99)-не может быть.
если как раз поменяем на a[i]:=random(20)-10 числа будут в интервале от -10 до 10.

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

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

Pascal

Сообщение NT » 20 ноя 2010, 19:28

Верните программу к виды как написали в начале темы.
Теперь найдите процедуру Delet.

Procedure Delet(k:integer;var z:mas);
var i:integer;
Begin
for i:=k to n-1 do
z[n]:=0;

z[i]:=z[i+1];
end.

Что в ней вы хотите делать?
Обратите внимание петла FOR в этой процедуре - ничего не делает за исключением
того , что (N-1) раз - вписывает в N- элемент значение 0.
Наверное не этого хотели достичь.
Поэтому вам и написал :
"Да проверьте программу, у вас циклы FOR - не правильно обозначены петли,
если несколько операторов должны выполнятся в теле, то надо их обьединять BEGIN ... END."
Последний раз редактировалось NT 29 ноя 2019, 12:59, всего редактировалось 1 раз.
Причина: test

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

Pascal

Сообщение Thomas » 20 ноя 2010, 19:33

да, тут ошибка.
надо менять местами.
сначало z[i]:=z[i+1]; a потом z[n]:=0;

Procedure Delet(k:integer;var z:mas);
var i:integer;
Begin
for i:=k to n-1 do z[i]:=z[i+1];
z[n]:=0;
end.



вот программа после преобразований
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
write(z[i],' ');
writeln;
end;
Procedure Delet(k:integer);
var i:integer;
Begin
for i:=k to n-1 do
a[i]:=a[i+1];
a[n]:=0;
end;

Begin
randomize;
for i:=1 to n do
a[i]:=random(20)-10;
Print(a);
Max:=A[1];
for i:=2 to n do begin
if max
Последний раз редактировалось Thomas 29 ноя 2019, 12:59, всего редактировалось 1 раз.
Причина: test

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

Pascal

Сообщение NT » 20 ноя 2010, 19:58

1 замечание:
a[i] :=random(20)-10;
Означает заполнение массива значениями = случайное значение из предела (0...20) минус 10.
T.e. входной массив (15 элементов) у вас может принимать значения от -10 до 10.
Этого вы хотели достигнуть?

2 замечание :
Процедура Print(z:mas);- поданый в качестве параметра массив выводит на экран.
He зависимо какое значение приписано элементу.
Этого вы хотели достигнуть?

3 замечание :
Что по вашему делает процедура Delet(k:integer;var z:mas);?
Напишите словами.
Последний раз редактировалось NT 29 ноя 2019, 12:59, всего редактировалось 1 раз.
Причина: test

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

Pascal

Сообщение Thomas » 20 ноя 2010, 20:03

1.да
2.мне обезательно нужно чтоб была процедура Print
3.удаляет Катый элемент ,сдвигает массив и формирует новый
Последний раз редактировалось Thomas 29 ноя 2019, 12:59, всего редактировалось 1 раз.
Причина: test

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

Pascal

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

Thomas писал(а):Source of the post
1.да
2.мне обезательно нужно чтоб была процедура Print
3.удаляет Катый элемент ,сдвигает массив и формирует новый

1. Ok
2. Ok. Только по-моему, не в том виде как сейчас есть. См. улучшения
3. Нет совсем. но в принципе можно так сказать.
T.e. точнее сказать так:
Сдвигает массив на один элемент влево, т.e. переписывает K+1 эл. на место K эл-та.
"Удаляет" - нет обнуляет последний элемент - это сделано к тому, что при следующим вызове этот ноль пойдет влево.

Теперь улучшения, которые приведут к лучшему результату:
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);
var i:integer;
Begin
for i:=k to n-1 do
a[i]:=a[i+1];
a[n]:=-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 begin max:=A[i]; /* Повторы Макса удалять */
Delet(i);
end;
end;
writeln(max);
Print(a);
readln;
end.
Последний раз редактировалось NT 29 ноя 2019, 12:59, всего редактировалось 1 раз.
Причина: test


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

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

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