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

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

Форум «Всё о Паскале» _ Задачи _ Задача по матрицам

Автор: unNamed 14.03.2005 14:38

Цитата
Из заданной матрицы Am*n исключить строки, содержащие хотябы 1 нулевой элемент.

Помогите пожалуйста с решением. Заранее Спасибо.

Автор: volvo 14.03.2005 14:45

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

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

Автор: Guest 14.03.2005 15:00

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

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

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

Автор: unNamed 14.03.2005 15:03

А так сама матрица по-идее просто рандомится.

Автор: volvo 14.03.2005 15:54

Цитата(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 14.03.2005 16:01

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

Спасибо за код, но похоже у меня все-таки динамическая матрица. Если не составит труда напишите пожалуйста вариант для такой матрицы.

Автор: volvo 14.03.2005 16:30

Ну, если динамическая, тогда:

Исходный код
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 14.03.2005 16:38

2Volvo: Спасибо за помощь )

Автор: unNamed 15.03.2005 2:42

Щас сел наконец за задачу, и все-таки первый вариант наверное мне больше подходит. Второй пример назватьт легеньким язык не повернется)
Только у меня все-равно возникли сложности.
Если переписать полностью ваш вариант, то выдает ошибку на "arr", так как она никак не описана. И есть пару вопросов: что делает MX, и зачем его описывать как ma3x, можно подредактировать этот код, чтобы n и m небыли постооянными, а вводились бы при запуске программы(write('vvedite n..'), read(n) и тп). Ещё мне надо чтобы таблица генерировалась с помощью random'а.

Автор: volvo 15.03.2005 2:54

Цитата(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 15.03.2005 3:29

2Volvo: Во! Спасибо большое, все заработает, все вроде понятно.

Автор: Lesnik 7.11.2006 15:53

А можно объяснить эту строчку из первого примера?
no_null := no_null and (arr[i, j] <> 0);

Недопонял smile.gif
Спс.

Автор: volvo 7.11.2006 16:04

Эта строчка не имеет смысла без предыдущей:

no_null := true;


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

Результат - если no_null = False, то в строке был нулевой элемент...