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

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

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

 
 Ответить  Открыть новую тему 
> Преобразование прямоугольной матрицы, Помогите с решением
Серёжка
сообщение 16.05.2007 10:20
Сообщение #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 
 К началу страницы 
+ Ответить 
samec
сообщение 16.05.2007 10:37
Сообщение #2


Бывалый
***

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

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


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





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

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


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

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

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


Гость






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

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

Сообщение отредактировано: Серёжка - 16.05.2007 11:09
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.05.2007 11:21
Сообщение #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 - 16.05.2007 11:26
 К началу страницы 
+ Ответить 
Серёжка
сообщение 16.05.2007 11:43
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.05.2007 12:10
Сообщение #8


Гость






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

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

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

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





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

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


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





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

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


А как написать функцию min? А то я что то не врубаюсь... blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.05.2007 14:01
Сообщение #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

 



- Текстовая версия 25.06.2025 3:40
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"