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

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

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

 
 Ответить  Открыть новую тему 
> динамическая матрица
compiler
сообщение 22.07.2007 18:01
Сообщение #1


Человек
*****

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

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


есть программка. она читает размеры матрицы, ее члены, печатает их, должна менять первый и последний столбик местами и опять печатает.
{$R-}
Type
TType = Word;
Type
PVector = ^TVector;
TVector = Array[1 .. 1] of TType;
PDynMatrix = ^TDynMatrix;
TDynMatrix = Array[1 .. 1] of PVector;

function max (const a:PVector):integer;
Var
i: Word;
begin
max:=0;
For i := 1 To round(SizeOf(PVector) / SizeOf(TType)) Do
if max< a^[i] then max:=a^[i];
end;


procedure ChPos(PV1, PV2:PVector);
var
p:pointer;
begin
p:=PV1;
PV1:=PV2;
PV2:=p;
end;


Var
mxDynamic: PDynMatrix;
n, m,i, j: Word;
Begin
write ('m='); ReadLn(m);{размеры}
write ('n='); ReadLn(n);//векторы

GetMem(mxDynamic, m * SizeOf(PVector));{память}
For i := 1 To n Do
GetMem(mxDynamic^[i], n * SizeOf(TType));


For i := 1 To n Do Begin{чтение}
WriteLn;
For j := 1 To m Do begin
write (' a[',i,',',j,']=');
ReadLn(mxDynamic^[I]^[J]);
end;
End;

For i := 1 To n Do Begin{печать}
WriteLn;
For j := 1 To m Do begin
write (' a[',i,',',j,']=');
WriteLn(mxDynamic^[I]^[J]:4);
end;
End;

ChPos(mxDynamic^[1],mxDynamic^[n]);//МЕНЯЮ, а оно не меняется sad.gif

For i := 1 To n Do Begin{печать}
WriteLn;
For j := 1 To m Do begin
write (' a[',i,',',j,']=');
WriteLn(mxDynamic^[I]^[J]:4);
end;
End;
readln;
read;

For i := 1 To m Do
FreeMem(mxDynamic^[i], m * SizeOf(TType));
For i := 1 To n Do
FreeMem(mxDynamic, n * SizeOf(PVector));
End.

почему столбики не меняются местами?

заранее благодарен.


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 22.07.2007 18:32
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

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


особо не вникал, но в ChPos параметры мне кажется надо передавать с приставкой var smile.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
compiler
сообщение 22.07.2007 18:38
Сообщение #3


Человек
*****

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

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


Цитата(klem4 @ 22.07.2007 18:32) *
особо не вникал, но в ChPos параметры мне кажется надо передавать с приставкой var smile.gif
да, так работает...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 22.07.2007 18:38
Сообщение #4


Гость






Ты бы уточнил, ты хочешь хранить матрицу как вектор СТРОК, или как вектор СТОЛБЦОВ (потому что со своими индексами m, n, i, j ты разбирайся сам, это ТЕБЕ известно что они обозначают, написать, чтобы было понятно всем - ты не соизволил)?

Если как вектор СТОЛБЦОВ - то ты неправильно ее заполняешь, если как вектор строк - то неправильно меняешь местами столбцы. В любом случае справедливо следующее:

1)
ты забыл:
procedure ChPos(VAR PV1, PV2:PVector); { <-- Var здесь }


2)
	GetMem(mxDynamic, m * SizeOf(PVector));{ Выделил M элементов, так будь добр}
For i := 1 To M Do { <--- Заполнять тоже M, а не N (исправлено, у тебя было N) }
GetMem(mxDynamic^[i], n * SizeOf(TType));


3)
	For i := 1 To m Do
FreeMem(mxDynamic^[i], m * SizeOf(TType));
For i := 1 To n Do
FreeMem(mxDynamic, n * SizeOf(PVector));

Это вообще неверно - ты должен удалить M векторов размера 1 .. N, и потом один вектор размера 1 .. M...

Сообщение отредактировано: volvo - 22.07.2007 18:41
 К началу страницы 
+ Ответить 
compiler
сообщение 22.07.2007 18:55
Сообщение #5


Человек
*****

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

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


Цитата(volvo @ 22.07.2007 18:38) *
Ты бы уточнил, ты хочешь хранить матрицу как вектор СТРОК, или как вектор СТОЛБЦОВ (потому что со своими индексами m, n, i, j ты разбирайся сам, это ТЕБЕ известно что они обозначают, написать, чтобы было понятно всем - ты не соизволил)?

n //векторы (следовательно их несколько smile.gif ), i, j -- счетчики... но это мало -- простите...


спасибо что вник... но доделывать уже нету времени

вот процедура для сортировки столбцов из соседней темы...
res:=false;{сортируем}
while ( not res) do begin
res:=true;
for i:=1 to (m-1) do begin
if sum(mxDynamic^[i]) < sum(mxDynamic^[i+1]) then begin
ChPos(mxDynamic^[i],mxDynamic^[i+1]);
res:=false;
end;
end;
end;

выложиш?


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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