Помощь - Поиск - Пользователи - Календарь
Полная версия: Вычёркивание строчки с нулевым элементом
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Lesnik
"Из матрицы А(mxn) надо исключить строки, содержащие хотябы один нулевой элемент"

Const
 n = ...;
 m = ...;
Type ma3x = array[1 .. n, 1 .. m] of integer;
var
 mx: ma3x;
 i, j: integer; no_null: boolean;
begin
 { тут заполняем матрицу }
 for i := 1 to n do
   begin
     no_null := true;
     for j := 1 to m do 
       no_null := no_null and (arr[i, j] <> 0);
     if no_null then
       begin
         for j := 1 to m do write(arr[i, j]:4);
         writeln
       end;
   end;
end.


Надо переделать для Delphi. Попробовал, получилось следующее:

var
i,j,n:integer;
no_null:boolean;
mas:array[0..100,0..100] of integer;
begin
if (edit1.Text='') then
showmessage('Çàïîëíèòå ïîëÿ')
else
begin
randomize;
n:=strtoint(edit1.text);
stringgrid1.ColCount:=n;
stringgrid1.RowCount:=n;
for i:=0 to  n do
  for j:=0 to n do
    begin
    mas[i,j]:= random(20)-10;
    stringgrid1.Cells[i,j] := inttostr (mas[i,j]);
end;
For i:=0 to n do
for j:=0 to n do
begin
no_null:=true;
no_null:=no_null and (mas[i,j]<>0);
If no_null then
begin
 for j:=0 to n do   { <-- Вот в этой строке}
stringgrid2.Cells[i,j] := inttostr (mas[i,j]);
end;

В строке, выделеной жирным отмеченной комментарием [Лопарь], вылезает ошибка, что цикл надо начинать с i.
Как это исправить? Спасибо.

М
Lesnik, для отметки места в программе используй комментарии. Лопарь

мисс_граффити
1. Сделать нормальное форматирование.
2. Прочитать, что за ошибка.
For i:=0 to n do
  for j:=0 to n do
  begin
  no_null:=true;
  no_null:=no_null and (mas[i,j]<>0);
  If no_null then
    begin
    for j:=0 to n do   { <-- Вот в этой строке}
      stringgrid2.Cells[i,j] := inttostr (mas[i,j]);
    end;


Вложенный цикл по той же переменной.
Lesnik
Программа в delphi работает неправильно.
С этой переменой h она удаляет не строчки а столбцы. И учитываю, что у меня результат выводится в Grid, пустые столбцы остаются sad.gif
Как можно решить эту проблему?
volvo
Цитата
Как можно решить эту проблему?
Так:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, curr: integer;
  no_null: boolean;
begin
  curr := 0;
  For i:=0 to pred(StringGrid1.RowCount) do begin
    no_null:=true;
    for j:=0 to pred(StringGrid1.ColCount) do
      no_null:=no_null and (strtoint(StringGrid1.Cells[j,i]) <> 0);

    If no_null then begin
      for j:=0 to pred(StringGrid1.ColCount) do
        stringgrid2.Cells[j, curr] := StringGrid1.Cells[j,i];
      inc(curr);
    end;
  end;
  StringGrid2.RowCount := curr;
end;  

(ты должен позаботиться о том, что у StringGrid-ов нет FixedCols/FixedRows)
Lesnik
Цитата(volvo @ 5.06.2007 23:21) *

Так:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, curr: integer;
  no_null: boolean;
begin
  curr := 0;
  For i:=0 to pred(StringGrid1.RowCount) do begin
    no_null:=true;
    for j:=0 to pred(StringGrid1.ColCount) do
      no_null:=no_null and (strtoint(StringGrid1.Cells[j,i]) <> 0);

    If no_null then begin
      for j:=0 to pred(StringGrid1.ColCount) do
        stringgrid2.Cells[j, curr] := StringGrid1.Cells[j,i];
      inc(curr);
    end;
  end;
  StringGrid2.RowCount := curr;
end;  

(ты должен позаботиться о том, что у StringGrid-ов нет FixedCols/FixedRows)


Не работает.
Ещё в этой верси не понимаю как можно сделать, чтобы пользователь воодил ко-во строк и столбцов.
P.S. Прикрепляю файл
P.S.S. Спасибо smile.gif
volvo
Цитата
Не работает.
Не работало - не выложил бы... За безапелляционный тон - разбирайся сам...
Lesnik
Цитата(volvo @ 6.06.2007 0:34) *

Не работало - не выложил бы... За безапелляционный тон - разбирайся сам...

Извини, но действительно нужна помощь.
Удалил прошлый код, вставил тот, который был выложен. fixedrows и colls равны 0 у обоих гридов. В чём проблема разобраться не могу sad.gif
volvo
В твоем проекте вот этот код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, curr: integer;
  no_null: boolean;
  n: integer;
begin
  n:=strtoint(edit1.text); // Было добавлено для отсечения всех незаполненных ячеек
  stringgrid1.ColCount:=n;
  stringgrid1.RowCount:=n;

  curr := 0;
  For i:=0 to pred(StringGrid1.RowCount) do begin
    no_null:=true;
    for j:=0 to pred(StringGrid1.ColCount) do
      no_null:=no_null and (strtoint(StringGrid1.Cells[j,i]) <> 0);

    If no_null then begin
      for j:=0 to pred(StringGrid1.ColCount) do
        stringgrid2.Cells[j, curr] := StringGrid1.Cells[j,i];
      inc(curr);
    end;
  end;
  StringGrid2.RowCount := curr;
end; 

отработал прекрасно...

(я установил в опциях StringGrid1 goEditing = True, и вносил данные прямо в грид)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.