Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2014, 21:06   #1
nWizz
Новичок
Джуниор
 
Регистрация: 29.04.2014
Сообщений: 1
По умолчанию Зависание программы (Delphi7)

Задание такое: Дан двумерный массив размером 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;
nWizz вне форума Ответить с цитированием
Старый 29.04.2014, 21:24   #2
ATL
Форумчанин
 
Аватар для ATL
 
Регистрация: 26.01.2007
Сообщений: 278
По умолчанию

Код:
while f=false do
Уберите этот цикл и всё будет хорошо.

Очевидно как-то так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
A: array of array of integer;
i,j,n,m,c,k: integer;
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;

for j := 0 to m-1 do
if A[0,j] > A[n-1,j] then
begin
  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;

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;

Последний раз редактировалось ATL; 29.04.2014 в 21:40.
ATL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MFC зависание программы Kukurudza Общие вопросы C/C++ 8 17.02.2012 21:41
Зависание программы с потоком casper0094 Общие вопросы Delphi 4 25.08.2010 22:49
Зависание программы. kardinal94 Общие вопросы Delphi 2 23.08.2010 17:36
CriticalSection -> зависание программы PUH Помощь студентам 1 05.11.2009 13:19