Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача по матрицам
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
unNamed
Цитата
Из заданной матрицы Am*n исключить строки, содержащие хотябы 1 нулевой элемент.

Помогите пожалуйста с решением. Заранее Спасибо.
volvo
С решением обязательно поможем, когда Вы проясните ситуацию, и скажете, что значит "исключить строку из матрицы"... Как задается матрица? (не является ли она динамической, потому что исключить строку из обычной матрицы будет затруднительно)...

Или Вам нужно просто распечатать матрицу без тех строк, которые содержат нулевые элементы? Так это не значит "исключить", матрица останется прежней...
Guest
Цитата(volvo @ 14.03.05 10:45)
С решением обязательно поможем, когда Вы проясните ситуацию, и скажете, что значит "исключить строку из матрицы"... Как задается матрица? (не является ли она динамической, потому что исключить строку из обычной матрицы будет затруднительно)...

Или Вам нужно просто распечатать матрицу без тех строк, которые содержат нулевые элементы? Так это не значит "исключить", матрица останется прежней...

Знал бы я сам что вкладывал автор задачи в эти слова... Но как мне кажется нужно просто вывести матрицу без строк, содержащих нулевые элементы.
И поясните, пожалуйста, что значит "динамическая матрица"?
unNamed
А так сама матрица по-идее просто рандомится.
volvo
Цитата(Guest @ 14.03.05 10:00)
как мне кажется нужно просто вывести матрицу без строк, содержащих нулевые элементы.

Тогда вот так:
Код
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.

С заполнением скорее всего проблем не будет... ;)

Цитата(Guest @ 14.03.05 10:00)
И поясните, пожалуйста, что значит "динамическая матрица"?

Это матрица, которая хранится в "куче" (динамической памяти), и ее размеры задаются не во время компиляции, а во время работы программы... Вот из нее можно исключить строку...
Guest
Цитата(volvo @ 14.03.05 11:54)
Это матрица, которая хранится в "куче" (динамической памяти), и ее размеры задаются не во время компиляции, а во время работы программы... Вот из нее можно исключить строку...

Спасибо за код, но похоже у меня все-таки динамическая матрица. Если не составит труда напишите пожалуйста вариант для такой матрицы.
volvo
Ну, если динамическая, тогда:
Исходный код
const
n: integer = 5;
m = 8;

type
pvector = ^vector;
vector = array[1 .. maxint] of integer;

pmatrix = ^matrix;
matrix = array[1 .. maxint div sizeof(pvector)] of pvector;

procedure print(p: pmatrix);
var i, j: integer;
begin
for i := 1 to n do
begin
for j := 1 to m do
write(p^[i]^[j]:4);
writeln
end;
end;

var
mx: pmatrix;
i, j: integer;
no_null: boolean;

size: integer;

begin
size := n;
getmem(mx, size * sizeof(pvector));
for i := 1 to n do
begin
getmem(mx^[i], m * sizeof(integer));
for j := 1 to m do
mx^[i]^[j] := random(20)
end;

writeln('before:');
print(mx);

for i := 1 to n do
begin
no_null := true;
for j := 1 to m do
no_null := no_null and (mx^[i]^[j] <> 0);
if not no_null then
begin
freemem(mx^[i], m * sizeof(integer));
mx^[i] := nil;
end;
end;

i := 1;
while i <= n do
begin
if mx^[i] = nil then
begin
move(mx^[i+1], mx^[i], (n - i)*sizeof(pvector));
dec(n)
end
else inc(i)
end;

writeln('after:');
print(mx);

for i := 1 to n do
freemem(mx^[i], m * sizeof(integer));
freemem(mx, size * sizeof(pvector))
end.
unNamed
2Volvo: Спасибо за помощь )
unNamed
Щас сел наконец за задачу, и все-таки первый вариант наверное мне больше подходит. Второй пример назватьт легеньким язык не повернется)
Только у меня все-равно возникли сложности.
Если переписать полностью ваш вариант, то выдает ошибку на "arr", так как она никак не описана. И есть пару вопросов: что делает MX, и зачем его описывать как ma3x, можно подредактировать этот код, чтобы n и m небыли постооянными, а вводились бы при запуске программы(write('vvedite n..'), read(n) и тп). Ещё мне надо чтобы таблица генерировалась с помощью random'а.
volvo
Цитата(unNamed @ 14.03.05 21:42)
Если переписать полностью ваш вариант, то выдает ошибку на "arr", так как она никак не описана. И есть пару вопросов: что делает MX, и зачем его описывать как ma3x, можно подредактировать этот код, чтобы n и m небыли постооянными, а вводились бы при запуске программы(write('vvedite n..'), read(n) и тп). Ещё мне надо чтобы таблица генерировалась с помощью random'а.

По порядку:
1. mx - заменить на arr... это я просто перепутал smile.gif
2. Если M и N не будут постоянными (а я об этом говорил), то нельзя описать такую матрицу. Все размеры должны быть известны на этапе компиляции, а не после запуска.

Но сейчас кое-что сделаю ;)

Добавлено:
Вот что получилось:
Исходный код
var
n: integer;
m: integer;

Type ma3x = array[1 .. 100, 1 .. 100] of integer;

var
arr: ma3x;
i, j: integer; no_null: boolean;
begin
{ в принципе надо бы вставить проверку на введенные числа,
чтобы они не были больше макс. возможного значения = 100 }
write('n = '); readln(n);
write('m = '); readln(m);

for i := 1 to n do
for j := 1 to m do
arr[i, j] := random(20);

writeln('before:');
for i := 1 to n do
begin
for j := 1 to m do
write(arr[i, j]:4);
writeln
end;

writeln('after:');
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.
Guest
2Volvo: Во! Спасибо большое, все заработает, все вроде понятно.
Lesnik
А можно объяснить эту строчку из первого примера?
no_null := no_null and (arr[i, j] <> 0);

Недопонял smile.gif
Спс.
volvo
Эта строчка не имеет смысла без предыдущей:
no_null := true;


Кроме того, она выполняется в цикле (проход по строке матрицы)...
В результате если хотя бы один элемент строки матрицы равнялся 0, то (arr[i, j] <> 0) будет равняться False, естественно, no_null тоже примет значение False (учитывая что False and {неважно_что} = False), и больше no_null никогда в этом цикле не сможет стать равным True (именно из-за операции and). Что нам и нужно...

Результат - если no_null = False, то в строке был нулевой элемент...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.