| 
| 
 | Вопрос # 5 318/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Решаю задачу - в матрице из 1 и 0 найти самый большой прямоугольник из 0
 Написала код, но он не работает((
 Как устранить ошибку не знаю, проверяла логику уже сотни раз что-то исправляла, что то добавляла, но по прежнему не работает
 В приложение прикладываю код с пометками, что, кто и как там
 А в остальном не знаю что добавить
 Очень надеюсь на вашу помощь
 Заранее спасибо =-)
 Приложение:Переключить в обычный режим program Project1; {$APPTYPE CONSOLE} uses  SysUtils; const n=10;{visota, stroki} m=5;{shirina, stolb}  type mas=array[1..n,1..m]of integer;  var i,j,q,w,e,w2:integer;      a:mas;      xnach,ynach:integer; {coordinati levogo verhnego tekushego}      xcon,ycon:integer;      x1,x2,y1,y2:integer;{koordinati max priam}      smax,s:integer;      k{shirina priam.},t{visota}:integer;      rabotaem:boolean;{dlia prekrashenia poiska priamoygol'nika v tekyshei iacheike}   procedure vivod(a:mas;n,m:integer);  begin    for i:=1 to n do     begin      for j := 1 to m do        write(a[i,j],' ');      writeln;     end;  end; begin randomize; for i:= 1 to n do   for j:= 1 to m do     a[i,j]:=random(2); vivod(a,n,m);s:=0; {s tekyshego}smax:=1; {max s poschitannay}rabotaem:=true; for i:=1 to n dofor j:= 1 to m do  if a[i,j]=0 then  begin {5}    xnach:=i; ynach:=j;    t:=i;     k:=j;{stroki}    w:=0;         while (a[t,k]=0) and (t<=n) do          begin          t:=t+1;          w:=w+1;          end;        s:=s+w;        xcon:=t-1; ycon:=k;  writeln('1 ',t,' ',w,' ',s,' ',xcon,' ',ycon);        if s>smax then           begin             smax:S;             x1:=xnach;             x2:=xcon;             y1:=ynach;             y2:=ycon;           end;          while (w<>0) do           begin{3}             w2:=0;{sravnenie kol-va stolbcov v dr.strokah}             for e:=j+1 to m do               begin {4}                 for q := 1 to w do if a[i+q-1,e]=0 then w2:=w2+1;                 s:=s+w;                 if w2=w then                   begin                     s:=s+w;                     ycon:=ycon+1;                     if s>smax then                       begin                         smax:S;                         y2:=ycon;                       end;                   end                 else                 begin                   w:=w-1;                   if w2<>0 then                     begin                      s:=s-(e-1);                      xcon:=xcon-1;                      if s>smax then                       begin                         smax:S;                         y2:=ycon;                         x2:=xcon;                       end;                     end;                   w2:=0;                 end;               end;  {4}             w:=0;             s:=0           end;{3}   end;  {5} Writeln(smax,' ploshad ',x1,' ',y1,' ',x2,' ',y2); readln;end.
|  |   Вопрос задала: Haenta (статус: Посетитель)Вопрос отправлен: 25 мая 2011, 19:57
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 14; последнее сообщение — 26 мая 2011, 18:19; участников в обсуждении: 3. 
|   | min@y™ (статус: Доктор наук), 25 мая 2011, 20:07 [#1]:Ты серьёзно реально думаешь, что кто-то будет копаться в этой жуткой писанине? Проще и быстрее с нуля написать. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Haenta (статус: Посетитель), 25 мая 2011, 20:18 [#2]:Мы ещё только учимся, поэтому не всё сразу получается В коде есть расшифровки
 Если бы всё было так легко и просто, наверное, уже всё бы решили и написали..
 Всё же надеюсь на помощь с указанием ошибки в коде..
 А кофе на клавиатуру тоже вирус пролил? |  
|   | min@y™ (статус: Доктор наук), 25 мая 2011, 20:25 [#3]:Я ж вижу, что код был написано на турбо-паскале, причём писарь не знал, как переключать раскладку клавиатуры в DOS-окне и писал комменты транслитом, от которого глаза режет. Также блещут профессионализмом одно- и двухбуквенные имена переменных. Я сильно сомневаюсь, что кто-то на этои портале будет препарировать этот код и делать рефакторинг, т.к. на это уйдёт на порядок больше времени, чем на написание программы с нуля. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Мережников Андрей (статус: Абитуриент), 25 мая 2011, 20:29 [#4]:Что значит не работает? какую ошибку выдает? |  
|   | Haenta (статус: Посетитель), 25 мая 2011, 20:33 [#5]:А ошибки нет, просто работает не правильно: высчитывает непонятное число А кофе на клавиатуру тоже вирус пролил? |  
|   | Haenta (статус: Посетитель), 25 мая 2011, 20:48 [#7]:Произвольную матрицу брала, смотрела какие значения у переменных получались и  какие должны были быть Значения не совпадали(
 А кофе на клавиатуру тоже вирус пролил? |  
|   | Мережников Андрей (статус: Абитуриент), 25 мая 2011, 21:01 [#8]: Цитата (Haenta): Произвольную матрицу брала, смотрела какие значения у переменных получались и какие должны были быть это не логику проверяли, а результат работы. Поставьте себя на место компьютера. Возьмите небольшую произвольную матрицу и попробуйте выполнить программу вручную. Может найдете где ошибка в алгоритме.
 |  
|   | Haenta (статус: Посетитель), 25 мая 2011, 21:05 [#9]:Мережников Андрей: >Возьмите небольшую произвольную матрицу и попробуйте выполнить программу вручную. Может найдете где ошибка в алгоритме.
 
 Так тоже делала найти не получается
 Точнее находила исправляла, находтла исправляла и все равно не работает
 А кофе на клавиатуру тоже вирус пролил? |  
|   | Мережников Андрей (статус: Абитуриент), 25 мая 2011, 22:07 [#10]:min@y правильно сказал - переименуйте переменные так, чтобы понятно было какая за что отвечает и напишите нормальные комментарии - самой проще разобраться будет. Что такое, например, переменные w и w2? Черт ногу сломит. |  
|   | Haenta (статус: Посетитель), 25 мая 2011, 23:16 [#11]:ну вот.. 
 
 program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
const n=10;{высота, строки} m=5;{ширина, столбцы}
  type mas=array[1..n,1..m]of integer;
  var i,t,q:integer;{счетчики строк}
      k,j,e:integer; {счетчики столбцов}
      w,w2:integer;{w-кол-во подрядидущих 0 справа от текущего элемента матрицы}
      a:mas;       {w2-кол-во подряд идущих 0 справа от элемента под текущим в строке e}
      xnach,ynach:integer; {координаты левого верхнего угла текущего прямоугольника}
      xcon,ycon:integer; {координаты правого нижнего угла текущего}
      x1,x2,y1,y2:integer;{координаты наибольшего прямоугольника}
      smax,s:integer; {площади наибольшего и текущего}
 
procedure vivod(a:mas;n,m:integer);
  begin
    for i:=1 to n do
     begin
      for j := 1 to m do
        write(a[i,j],' ');
      writeln;
     end;
  end;
 
begin
randomize;
 for i:= 1 to n do
   for j:= 1 to m do
     a[i,j]:=random(2);
vivod(a,n,m);
 
s:=0;
smax:=1;
 
for i:=1 to n do
for j:= 1 to m do
  if a[i,j]=0 then  {текущий элемент}
  begin {5}
    xnach:=i; ynach:=j;
    t:=i;     k:=j;
    w:=0;
 
        while (a[t,k]=0) and (t<=n) do  {в право от текущего }
          begin
          t:=t+1;
          w:=w+1;                       {считая 0}
          end;
        s:=s+w;
        xcon:=t-1; ycon:=k;   {сохраняем координаты правого нижнего угла текущего}
        if s>smax then
           begin
             smax:S;     {сравниваем площ.текузего с площ.максимального}
             x1:=xnach;
             x2:=xcon;    {сохраняем координаты максимального}
             y1:=ynach;
             y2:=ycon;
           end;
 
         while (w<>0) do
           begin{3}
             w2:=0;
             for e:=j+1 to m do {от столбца текущего до конечного}
               begin {4}
                 for q := 1 to w do if a[i+q-1,e]=0 then w2:=w2+1;{*}
                 s:=s+w;    {*считаем подряд идущие 0 справа от эл-та под текущим в строке e}
                 if w2=w then  {если значения совпадают значит фигура прямоугольник}
                   begin
                     s:=s+w;
                     ycon:=ycon+1;
                     if s>smax then
                       begin
                         smax:S;
                         y2:=ycon;
                       end;
                   end
                 else
                 begin {не совпадают - уменьшаем W до тех пор пока колво 0 в строках не совпадет}
                   w:=w-1;
                   if w2<>0 then
                     begin    {если w2=0 то площадь ненадо уменьшать}
                      s:=s-(e-1);
                      xcon:=xcon-1;
                      if s>smax then
                       begin
                         smax:S;
                         y2:=ycon;
                         x2:=xcon;
                       end;
                     end
                   else w:=0; {если w2=0 то следущие строки проверять не нужно}
                   w2:=0;
                 end;
               end;  {4}
             w:=0;
             s:=0;
           end;{3}
 
  end;  {5}
 Writeln(smax,' ploshad ',x1,' ',y1,' ',x2,' ',y2);
 readln;
end.А кофе на клавиатуру тоже вирус пролил? |  
|   | Мережников Андрей (статус: Абитуриент), 26 мая 2011, 05:50 [#12]: Цитата (Haenta): while (a[t,k]=0) and (t<=n) do {в право от текущего } begin t:=t+1; если t - это счетчик строк, то почему перемещение вправо - ассоциируется с перемещением по строкам?
 |  
|   | min@y™ (статус: Доктор наук), 26 мая 2011, 08:10 [#13]: Цитата (Haenta): ну вот.. Понятней не стало.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Haenta (статус: Посетитель), 26 мая 2011, 18:19 [#14]:было напутано со стороками и столбцами, но не работает по прежнему..( 
 
 program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
const n=10;{высота, строки} m=5;{ширина, столбцы}
  type mas=array[1..n,1..m]of integer;
  var i,t,q:integer;{счетчики строк}
      k,j,e:integer; {счетчики столбцов}
      w,w2:integer;{w-кол-во подрядидущих 0 справа от текущего элемента матрицы}
      a:mas;       {w2-кол-во подряд идущих 0 справа от элемента под текущим в строке e}
      xnach,ynach:integer; {координаты левого верхнего угла текущего прямоугольника}
      xcon,ycon:integer; {координаты правого нижнего угла текущего}
      x1,x2,y1,y2:integer;{координаты наибольшего прямоугольника}
      smax,s:integer; {площади наибольшего и текущего}
 
procedure vivod(a:mas;n,m:integer);
  begin
    for i:=1 to n do
     begin
      for j := 1 to m do
        write(a[i,j],' ');
      writeln;
     end;
  end;
 
begin
randomize;
 for i:= 1 to n do
   for j:= 1 to m do
     a[i,j]:=random(2);
vivod(a,n,m);
 
s:=0;
smax:=1;
 
for i:=1 to n do  {строки}
for j:= 1 to m do   {столбцы}
  if a[i,j]=0 then  {текущий элемент}
  begin {5}
    ynach:=i; xnach:=j;
    t:=i;     k:=j;
    w:=0;
 
        while (a[t,k]=0) and (k<=m) do  {в право от текущего }
          begin
          k:=k+1;
          w:=w+1;                       {считая 0}
          end;
        s:=s+w;
        ycon:=t; xcon:=k-1;   {сохраняем координаты правого нижнего угла текущего}
        if s>smax then
           begin
             smax:S;     {сравниваем площ.текузего с площ.максимального}
             x1:=xnach;
             x2:=xcon;    {сохраняем координаты максимального}
             y1:=ynach;
             y2:=ycon;
           end;
 
         while (w<>0) do
           begin{3}
             w2:=0;
             for q:=i+1 to n do {от столбца текущего до конечного}
               begin {4}
                 for e := 1 to w do if a[q,j+e-1]=0 then w2:=w2+1;{*}
                 s:=s+w;    {*считаем подряд идущие 0 справа от эл-та под текущим в строке q}
                 if w2=w then  {если значения совпадают значит фигура прямоугольник}
                   begin
                     s:=s+w;
                     ycon:=ycon+1;
                     if s>smax then
                       begin
                         smax:S;
                         y2:=ycon;
                       end;
                   end
                 else
                 begin {не совпадают - уменьшаем W до тех пор пока колво 0 в строках не совпадет}
                   w:=w-1;
                   if w2<>0 then
                     begin    {если w2=0 то площадь ненадо уменьшать}
                      s:=s-(e-1);
                      xcon:=xcon-1;
                      if s>smax then
                       begin
                         smax:S;
                         y2:=ycon;
                         x2:=xcon;
                       end;
                     end
                   else w:=0; {если w2=0 то следущие строки проверять не нужно}
                   w2:=0;
                 end;
               end;  {4}
             w:=0;
             s:=0;
           end;{3}
 
  end;  {5}
 Writeln(smax,' ploshad ',x1,' ',y1,' ',x2,' ',y2);
 readln;
end.А кофе на клавиатуру тоже вирус пролил? |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |