Извиняюсь за тупость blush.gif , но вроде for i:=i to N do правильно, при нахождении удаляемого элемента нет нужды заводить цикл со значениями i которые меньше его текушего значения.
В сдвиге вынес N:=N-1 за цикл for а то она массив обрезала N-i раз, а надо было только один.

Но ошибку все равно выдает.

program Masiv;
uses crt;
const Nmax=16;
type mas= array [1..Nmax] of integer;
var G,M:mas; var N:integer;

procedure Enter (var M:mas; Nmax:integer; var N:integer);
var i,x:integer;
begin
N:=0;
for i:=1 to Nmax do
begin
write ('M[',i,']=');
readln (x);
if x=0 then break;
inc (N); M[i]:=x;
end;
end;

procedure Print (var M:mas; N:integer);
var i:integer;
begin
for i:=1 to N do
write (M[i],'; ');
writeln;
end;


procedure Work (var M:mas; var G:mas; N:integer);
var j,i,b,sym,ost:integer; f,q:boolean;
begin
for j:=1 to 178 do
G[j]:=j*j;
for i:=1 to N do
begin f:=true; sym:=0; ost:=0; q:=false;
b:=m[i];
for j:=1 to 178 do
begin
if g[j]=m[i] then
begin
q:=true; break;
end;
end;
repeat
ost:=b mod 10;
sym:=sym + ost;
b:=b div 10;
until b=0;
if sym mod 2=0 then f:=false;
if (f=true) and (q=true) then
begin
for i:=i to N do
m[i]:=m[i+1];
N:=N-1;
end;
end;
end;

Begin clrscr;
Enter (M,Nmax,N);
Print (M,N);
Work (M,G,N);
Print (M,N);
readkey
End.

Помогите, а то в четверг уже надо сдавать. newconfus.gif