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

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

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

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





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

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


Народ помогите с задачей:
Дана матрица 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;
...............

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Бывалый
***

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

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


А если возникнет ситуация, при которой число строк матрицы больше или наоборот меньше размерности вектора, то по какому правилу заменть столбцы???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





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

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


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

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

В этом случае я думаю надо делать так:
если число строк матрицы больше чем размерность вектора то нужно вектор дополнить нулями, ну а если число строк меньше чем размерность вектора, то нужно вектор обрезать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

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





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

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


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

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

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

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

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


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

Сообщение отредактировано: Серёжка -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Да не так ты мыслишь... Вот что я имел в виду:
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 придется написать самому...)
При распечатке матрицы надо учитывать то же самое, что и при вводе - индексы меняются местами!

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7





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

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


Ого как сложно!!! 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;

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






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

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

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

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





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

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


Вроде понял, что к чему! good.gif
ОГРОМНОЕ СПАСИБО!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10





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

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


А как написать функцию min? А то я что то не врубаюсь... blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






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

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

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

end;
 К началу страницы 
+ Ответить 

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

 





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