IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача по матрицам, Легенькая задачка. Пжл помогите решить.
сообщение
Сообщение #1


Гость






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

Помогите пожалуйста с решением. Заранее Спасибо.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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

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


Гость






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

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

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


Гость






А так сама матрица по-идее просто рандомится.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата(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)
И поясните, пожалуйста, что значит "динамическая матрица"?

Это матрица, которая хранится в "куче" (динамической памяти), и ее размеры задаются не во время компиляции, а во время работы программы... Вот из нее можно исключить строку...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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

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


Гость






Ну, если динамическая, тогда:
Исходный код
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.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






2Volvo: Спасибо за помощь )
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






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


Гость






Цитата(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.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






2Volvo: Во! Спасибо большое, все заработает, все вроде понятно.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской

Репутация: -  0  +


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

Недопонял smile.gif
Спс.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






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


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

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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.11.2021 15:35
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name