Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ динамическая матрица

Автор: compiler 22.07.2007 22:01

есть программка. она читает размеры матрицы, ее члены, печатает их, должна менять первый и последний столбик местами и опять печатает.

{$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 22.07.2007 22:32

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

Автор: compiler 22.07.2007 22:38

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

Автор: volvo 22.07.2007 22:38

Ты бы уточнил, ты хочешь хранить матрицу как вектор СТРОК, или как вектор СТОЛБЦОВ (потому что со своими индексами 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 22.07.2007 22:55

Цитата(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;

выложиш?