Показать сообщение отдельно
  #15  
Старый 21.11.2010, 20:00
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Код:
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.
Ответить с цитированием