Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Вычёркивание строчки с нулевым элементом

Автор: Lesnik 17.05.2007 13:14

"Из матрицы А(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, для отметки места в программе используй комментарии. Лопарь


Автор: мисс_граффити 17.05.2007 15:24

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 6.06.2007 1:55

Программа в delphi работает неправильно.
С этой переменой h она удаляет не строчки а столбцы. И учитываю, что у меня результат выводится в Grid, пустые столбцы остаются sad.gif
Как можно решить эту проблему?

Автор: volvo 6.06.2007 2: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)

Автор: Lesnik 6.06.2007 3:27

Цитата(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


Прикрепленные файлы
Прикрепленный файл  Project1.zip ( 3.71 килобайт ) Кол-во скачиваний: 155

Автор: volvo 6.06.2007 3:34

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


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: Lesnik 6.06.2007 4:10

Цитата(volvo @ 6.06.2007 0:34) *

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

Извини, но действительно нужна помощь.
Удалил прошлый код, вставил тот, который был выложен. fixedrows и colls равны 0 у обоих гридов. В чём проблема разобраться не могу sad.gif

Автор: volvo 6.06.2007 4:22

В твоем проекте вот этот код:

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, и вносил данные прямо в грид)