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

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

Форум «Всё о Паскале» _ Задачи _ Преобразование прямоугольной матрицы

Автор: Серёжка 16.05.2007 14:20

Народ помогите с задачей:
Дана матрица B размером m*n и вектор C размером k, нужно заменить вектором С столбцы марицы B, не содержащие ни одного отрицательного элемента?
Я эту задачу начал делать, но не могу сообразить какой цикл там надо применять при замене столбца на вектор. Помогите с решением. Плиз. Заранее спасибо!
Вот начало моей программы:


program matrica;
coust m1=15; n1=15; k1=15;
type index_1=1..m1;
index_2=1..n1;
index_3=1..k1;
matrix=array[index_1,index_2] of real;
vector=array[index_3] of real;
var m,i: index_1;
n,j: index_2;
k,l: index_3;
B:matrix;
C:vector;
begin
write ('Число строк матрицы В m= ');
readln(m);
write ('Число столбцов матрицы В n= ');
readln(n);
write ('Число элементов вектора C k= ');
readln(k);
writeln (' ':23,'Введите элементы матрицы B');
for i:=1 to m do for j:=1 to n do
begin
write ('A[',i,',',j,']=');
readln (a[i,j]);
end;
writeln (' ':23,'Введите элементы вектора C');
for l:=1 to k do
begin
write ('C[',i,']=');
readln (c[l]);
end;
...............


Автор: samec 16.05.2007 14:37

А если возникнет ситуация, при которой число строк матрицы больше или наоборот меньше размерности вектора, то по какому правилу заменть столбцы???

Автор: Серёжка 16.05.2007 14:46

Цитата(samec @ 16.05.2007 10:37) *

А если возникнет ситуация, при которой число строк матрицы больше или наоборот меньше размерности вектора, то по какому правилу заменть столбцы???

В этом случае я думаю надо делать так:
если число строк матрицы больше чем размерность вектора то нужно вектор дополнить нулями, ну а если число строк меньше чем размерность вектора, то нужно вектор обрезать.

Автор: volvo 16.05.2007 14:56

Серёжка, кстати, это - классический пример ситуации, когда человек сначала создает себе проблемы, а потом успешно их решает... А если не создавать?

Я вот о чем: смотрим внимательно на задание -

Цитата
Дана матрица B размером m*n и вектор C размером k, нужно заменить вектором С столбцы марицы B, не содержащие ни одного отрицательного элемента?
Представляешь, насколько все будет проще, если рассматривать матрицу НЕ как массив строк (что ты делаешь сейчас), а как массив столбцов? С одной стороны это облегчает поиск отрицательных элементов в столбце (ты же будешь работать со столбцом, как с обычным массивом)... С другой стороны - замена столбца - вообще одним оператором...

Автор: Серёжка 16.05.2007 15:07

Цитата(volvo @ 16.05.2007 10:56) *

Серёжка, кстати, это - классический пример ситуации, когда человек сначала создает себе проблемы, а потом успешно их решает... А если не создавать?

Я вот о чем: смотрим внимательно на задание - Представляешь, насколько все будет проще, если рассматривать матрицу НЕ как массив строк (что ты делаешь сейчас), а как массив столбцов? С одной стороны это облегчает поиск отрицательных элементов в столбце (ты же будешь работать со столбцом, как с обычным массивом)... С другой стороны - замена столбца - вообще одним оператором...

Ну я примерно так и мыслю, просто мои познания Паскаля очень, очень маленькие. unsure.gif
А код будет примерно такой при замене столбцов, правда я его ещё не додумал:

For j:=1 to n do
For i:=1 to m do
begin
А вот здесь я должен проверит если ли в столбце отрицательный
элемент или нет, если нет заменить этот столбей на вектор
end


Если что не та подправте пожалуста. smile.gif

Автор: volvo 16.05.2007 15:21

Да не так ты мыслишь... Вот что я имел в виду:

type
column = array[1 .. m1] of real;
matrix = array[1 .. n1] of column;
vector = array[1 .. k1] of real;

function has_negative(clmn: column): boolean;
var i: integer;
begin
has_negative := false;
for i := 1 to m1 do if clmn[i] < 0 then has_negative := true;
end;

var
T: column;
...
writeln (' ':23,'Введите элементы матрицы B');
for i:=1 to m do
for j:=1 to n do begin
write ('A[',i,',',j,']=');
readln (a[j][i]); { <--- Внимание на индексы !!! Первый - столбец, второй - строка }
end;

...
{ для проверки, есть ли в столбце хоть один отр. элемент и замены столбца вектором: }
{ сначала подготовим вектор - вдруг длина разная... }
for i := 1 to min(k, m1) do T[i] := C[i]; { недостающие будут нулями, лишние - отсекутся}

{ Добавлено!!! Предыдущая строка вообще не нужна, если константа K1 равна константе M1 }

for i := 1 to n do { <--- проходим по всем столбцам }
if has_negative(a[i]) then a[i] := T; { <--- и заменяем если надо }
...

(функцию min придется написать самому...)
При распечатке матрицы надо учитывать то же самое, что и при вводе - индексы меняются местами!

Автор: Серёжка 16.05.2007 15:43

Ого как сложно!!! unsure.gif
Слушай, извини за наглость, но не мог бы ты объяснить вот эти строчки кода, а то я совсем их не понял:

type
column = array[1 .. m1] of real;
matrix = array[1 .. n1] of column; {А почему здесь матрица, представлена как одномерный массив?}
vector = array[1 .. k1] of real;

function has_negative(clmn: column): boolean;
var i: integer;
begin
has_negative := false;
for i := 1 to m1 do if clmn[i] < 0 then has_negative := true;
end;


Автор: volvo 16.05.2007 16:10

Все далеко не так сложно, как тебе кажется... А если в результате написать программу твоим первоначальным способом, и тем, что я предложил, то разница в размере будет налицо... Да и отлаживать/изменять структурированную программу проще.

Теперь о вопросе:

Цитата
{А почему здесь матрица, представлена как одномерный массив?}
Да, но ты не сказал, массив ЧЕГО? Это массив столбцов, а ведь каждый из них представляем собой в свою очередь тоже массив...

Вот ты написал:
matrix=array[index_1,index_2] of real;
А ведь это - то же самое, что
matrix=array[index_1] of array[index_2] of real;
, ну и у меня так же, только я сначала отдельно описываю тип, а потом его использую...

А ниже - функция, которая в передаваемом ей массиве ищет отрицательный элемент, и как только первый отрицательный найден, запоминает в качестве своего результата True (изначально я предполагаю, что в столбце НЕТ отрицательных элементов)

Автор: Серёжка 16.05.2007 16:27

Вроде понял, что к чему! good.gif
ОГРОМНОЕ СПАСИБО!!!

Автор: Серёжка 16.05.2007 17:56

А как написать функцию min? А то я что то не врубаюсь... blink.gif

Автор: volvo 16.05.2007 18:01

Цитата
А как написать функцию min?

function min(a, b: integer): integer;
begin

min := a; { <-- Делаем предположение, что A - минимум }
if b < a then min := b; { <-- Если предположение было ошибочным, и B меньше A - то вернем B }

end;