Код:
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-циклы: у них количество итераций определяется сразу, и от изменения границ внутри цикла ниче не меняется.