|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Работа с массивами (удаление повторяющихся элементов)
Как записать условие для удаления повотряющихся и как удалить повторяющиеся все элементы.
Вот мой код для этой подпрограммы, что нужно исправить/дописать? Код:
procedure DelEvenElement(var a:TArray100;var cnt:integer); var i,j:integer; begin {i:=1; while i<=cnt do begin} for i:=cnt downto 1 do if a[i]=a[i+1] then begin for j:=i to cnt do a[j]:=a[j+1]; cnt:=cnt-1; {end else i:=i+1;} end; end; |
#2
|
|||
|
|||
Код:
for i := High(a) downto Low(a)+1 do for j := i - 1 downto Low(a) do if a[i] = a[j] then begin a[i] := 0; // Ну или как ты там собираешься удалять. break; end; можно еще сделать копированием - создавать новый массив, при этом вставлять в него только те элементы, которых внем еще нет. |
#3
|
|||
|
|||
Ладно, а как реализовать удаление?
|
#4
|
|||
|
|||
Ну люди помогите, пожалуйста, очень нужно
|
#5
|
||||
|
||||
Для начала скажи что это за тип TArray100 ?
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#6
|
|||
|
|||
Тип массива назван для удобства.
А тип объявил так: type TArray100=array[1..100]of integer; |
#7
|
|||
|
|||
Это статический массив. Ты все-равно не можешь физически удалить в нем элемент. Ты можешь только пометить его как удаленный. Либо переделывай на динамический, либо надо изобретать механизм, указывающий, что элемент удален.
|
#8
|
|||
|
|||
А как сесь можно реализовать удаление вставкой.
Могу выложить код того же массива, но там удаляет все четные элементы и нормально работает. |
#9
|
||||
|
||||
Есть логическое и физическое удаление. В случае с физическим удалением размер массива меняется в зависимости от количества элементов, а вот в случае логического удаления размер массива будет неизменным, но количество элементов может менятся.
Удаление элементов из статического массива можно реализовать таким образом: Код:
Type TArray100=array[1..100]of integer; Var Arr: TArray100; ArrSize: Integer; // Переменная отвчающая за количество элементов в массиве. begin ArrSize := 100; for i := 1 to ArrSize do Arr[i] := Random(100); //Заполним массив ArrSize := 99; for i := 50 to ArrSize do Arr[i] := Arr[i+1]; //Удаляем 50-й элемент из массива end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#10
|
|||
|
|||
Тогда у меня правильно реализовано удаление, код подпрограммы в первом посту.
Я массив сортирую для удобного удаления, но задача моя удалить все повторяющиеся элементы, а у меня удаляет все, кроме последнего повторяющегося элемента. Например 5 1 2 4 8 9 5 4 5 5 4, то удаляет все 4 и 5 кроме последних После моей процедуры получится такой новый массив 1 2 4 5 8 9, а мне нужно получить такой массив 1 2 8 9. То есть удалить все 4 и 5. Может с условием что-то не так? Извините пожалуйста, если вас заставил делать ту же работу, которую проделал я. |
#11
|
|||
|
|||
делай копированием - не ошибешься.
Код:
var A, B : Array Of Integer; I, J : Integer; F: Boolean; begin // Инициализируем исходный массив SetLength(A, 100); For I := Low(A) To High(A) Do A[i] := Random(50); // Удаление методом копирования // просто создаем новый массив setLength(B,0); For I := Low(A) To High(A) Do Begin F := True; For J := Low(B) To High(B) Do If A[i] = B[j] Then Begin F := False; Break; End; If F Then Begin setLength(B,Length(B)+1); B[High(B)] := A[i]; End; End; end; в конце работы программы получишь массив B, в котором нет повторяющихся элементов. |
#12
|
|||
|
|||
1. Выдает ошибку о несовместимости типов.
2. Исходный массив я уже передаю по ссылке. Вот код всех моих подпрограмм: Создание массива Код:
procedure createRandomArray(var a:TArray100;cnt,modul:integer); var i:integer; begin randomize; for i:=1 to cnt do a[i]:=random(modul); end; Код:
function ArrayToStr(const a:TArray100;cnt:integer):string; var i:integer; begin result:=''; for i:=1 to cnt do result:=result+intToStr(a[i])+' '; end; Код:
procedure getArrayFromStr(var a:TArray100;var cnt:integer; const s:string); var wep:integer; w:string[20];s1:string; begin s1:=s; cnt:=0; while length(Trim(s1))>0 do begin s1:=Trim(s1); wep:=Pos(' ',s1); if wep=0 then wep:=length(s1) else wep:=wep-1; w:=copy(s1,1,wep); delete(s1,1,wep); cnt:=cnt+1; a[cnt]:=strtoint(w); end; end; Код:
procedure showArrayInMemo(const a:TArray100;cnt:integer;Memo1:TMemo); var i:integer; begin Memo1.Clear; for i:=1 to cnt do begin Memo1.Lines.Add(inttostr(a[i])); end; end; Код:
procedure SortArray(var a:TArray100;cnt:integer); var last,x,i:integer;ok:boolean; begin last:=cnt; repeat ok:=true; for i:=1 to last-1 do if a[i]>a[i+1] then begin x:=a[i]; a[i]:=a[i+1]; a[i+1]:=x; ok:=false; end; until ok; end; Код:
procedure DelEvenElement(var a:TArray100;var cnt:integer); var i,j:integer; begin for i:=cnt downto 1 do if a[i]=a[i+1] then begin for j:=i to cnt do a[j]:=a[j+1]; cnt:=cnt-1; end; end; |
#13
|
|||
|
|||
Ну выложил я коды своих процедур, как мне изменить свою процедуру удаления элементов из массива?
В написаной программе выдает ошибку о несовместимости типов в этих строках Код:
setLength(B,0); Код:
setLength(B,Length(B)+1); |
#14
|
|||
|
|||
Если использование именно массива:
TArray100=array[1..100]of integer; это не жесткое условие задачи. То, как вариант, можно использовать TStrings... --------------- Sorry, не заметил, что вариант уже предлагался. Надо удалить это сообщение. Последний раз редактировалось roamer, 21.11.2010 в 19:50. |
#15
|
||||
|
||||
Код:
procedure DelEvenElement(var a:TArray100;var cnt:integer); var i,j:integer; begin for i:=cnt downto 1 do if a[i]=a[i+1] then begin for j:=i to cnt do a[j]:=a[j+1]; cnt:=cnt-1; end; end; А надо: "просмотреть все элементы с последнего до первого, и если в промежутке между первым и текущим есть еще один текущий - удалить текущий". Думаю примерно так: Код:
procedure DelEvenElement(var a:TArray100;var cnt:integer); var i,j,k:integer; begin i:=cnt; while i>=1 do begin for k:=1 to i-1 do if a[i]=a[k] then begin for j:=i to cnt do a[j]:=a[j+1]; cnt:=cnt-1; break; end; dec(i); end; end; Код:
procedure DelEvenElement1(var a:TArray100;var cnt:integer); var i,j,k:integer; fl:boolean; begin i:=cnt; while i>=1 do begin fl:=false; k:=1; while k<= i-1 do begin if a[i]=a[k] then begin fl:=true; for j:=k to cnt do a[j]:=a[j+1]; cnt:=cnt-1; dec(i); end; inc(k); end; if fl then begin for j:=i to cnt do a[j]:=a[j+1]; cnt:=cnt-1; end; dec(i); end; end; Оба кода протестил - вроде пашет. З.Ы. при удалении элементов лучше не юзать FOR-циклы: у них количество итераций определяется сразу, и от изменения границ внутри цикла ниче не меняется. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 21.11.2010 в 20:22. |