Помощь - Поиск - Пользователи - Календарь
Полная версия: динамическая матрица
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
compiler
есть программка. она читает размеры матрицы, ее члены, печатает их, должна менять первый и последний столбик местами и опять печатает.
{$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.

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

заранее благодарен.
klem4
особо не вникал, но в ChPos параметры мне кажется надо передавать с приставкой var smile.gif
compiler
Цитата(klem4 @ 22.07.2007 18:32) *
особо не вникал, но в ChPos параметры мне кажется надо передавать с приставкой var smile.gif
да, так работает...
volvo
Ты бы уточнил, ты хочешь хранить матрицу как вектор СТРОК, или как вектор СТОЛБЦОВ (потому что со своими индексами 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...
compiler
Цитата(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;

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