Помощь - Поиск - Пользователи - Календарь
Полная версия: Преобразование прямоугольной матрицы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Серёжка
Народ помогите с задачей:
Дана матрица 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
А если возникнет ситуация, при которой число строк матрицы больше или наоборот меньше размерности вектора, то по какому правилу заменть столбцы???
Серёжка
Цитата(samec @ 16.05.2007 10:37) *

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

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

Я вот о чем: смотрим внимательно на задание -
Цитата
Дана матрица B размером m*n и вектор C размером k, нужно заменить вектором С столбцы марицы B, не содержащие ни одного отрицательного элемента?
Представляешь, насколько все будет проще, если рассматривать матрицу НЕ как массив строк (что ты делаешь сейчас), а как массив столбцов? С одной стороны это облегчает поиск отрицательных элементов в столбце (ты же будешь работать со столбцом, как с обычным массивом)... С другой стороны - замена столбца - вообще одним оператором...
Серёжка
Цитата(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
Да не так ты мыслишь... Вот что я имел в виду:
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 придется написать самому...)
При распечатке матрицы надо учитывать то же самое, что и при вводе - индексы меняются местами!
Серёжка
Ого как сложно!!! 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
Все далеко не так сложно, как тебе кажется... А если в результате написать программу твоим первоначальным способом, и тем, что я предложил, то разница в размере будет налицо... Да и отлаживать/изменять структурированную программу проще.

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

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

А ниже - функция, которая в передаваемом ей массиве ищет отрицательный элемент, и как только первый отрицательный найден, запоминает в качестве своего результата True (изначально я предполагаю, что в столбце НЕТ отрицательных элементов)
Серёжка
Вроде понял, что к чему! good.gif
ОГРОМНОЕ СПАСИБО!!!
Серёжка
А как написать функцию min? А то я что то не врубаюсь... blink.gif
volvo
Цитата
А как написать функцию min?

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

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

end;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.