Помощь - Поиск - Пользователи - Календарь
Полная версия: динамическая матрица
Форум «Всё о Паскале» > 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]);//МЕНЯЮ, а оно не меняется 

	
	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;

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