Задание такое: Дан двумерный массив размером n*m, заполненный случайным образом. Удалить все столбцы, в которых первый элемент больше последнего.
Само решение выглядит так:
| Код | c:=m; while f=false do begin f:=true; for j:=0 to m-1 do if A[0,j]>A[n-1,j] then begin f:=false; c:=c-1; for i:=0 to n-1 do for k:=j to m-1-j do A[i,k]:=A[i,k+1]; end; end;
|
Проблема в том, что при определенных значениях программа зависает, т.е. видимо цикл где-то не завершается. Но не пойму, почему? Проверил уже не раз, все равно не пойму и даже не представляю в чем дело.
Вот полный вариант кода
| Код | procedure TForm1.Button3Click(Sender: TObject); var A:array of array of integer; i,j,n,m,c,k:integer; f:boolean; begin n:=StrToInt(Edit1.Text); m:=StrToInt(Edit2.Text); SetLength(A,n,m); for i:=1 to n do for j:=1 to m do A[i-1,j-1]:=random(11); StringGrid2.RowCount:=n+1; StringGrid2.ColCount:=m+1; with StringGrid2 do begin i:=0; for j:=1 to rowcount do Cells[i,j]:=Inttostr(j); j:=0; for i:=1 to colcount do cells[i,j]:=inttostr(i); end; with StringGrid2 do for i:=1 to n do for j:=1 to m do Cells[j,i]:=IntToStr(A[i-1,j-1]); c:=m; while f=false do begin f:=true; for j:=0 to m-1 do if A[0,j]>A[n-1,j] then begin f:=false; c:=c-1; for i:=0 to n-1 do for k:=j to m-1-j do A[i,k]:=A[i,k+1]; end; end; StringGrid1.RowCount:=n+1; StringGrid1.ColCount:=c+1; with StringGrid1 do begin i:=0; for j:=1 to rowcount do Cells[i,j]:=Inttostr(j); j:=0; for i:=1 to colcount do cells[i,j]:=inttostr(i); end; with StringGrid1 do for i:=1 to n do for j:=1 to m do Cells[j,i]:=IntToStr(A[i-1,j-1]); end;
|
|