Динамические массивы(2d)
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Задание: транспонировать матрицу(строку сделать столбцом, а столбец-строкой).
Был вариант решения: ввести матрицу a[i,j], затем каждый элемент присвоить итоговой матрице b[j,i]:=a[i,j]. Предварительно выделить память под каждую из них.
Решение правильное, но нерациональное в плане памяти.
Теперь пробую работать с динамическим массивом(раньше никогда и не слышал о них):
type TMas=array [0..0,0..0] of integer;
var i,j,n:integer;
p:^TMas:
begin
write('Vvedite n=');read(n);
getmem(p,n*n*sizeof(integer));{нужно, чтобы память зависела от размера квадратной матрицы}
for i:=1 to n do
for j:=1 to n do
read(p^[i,j]);
writeln('Rezultat>');
for i:=1 to n do
begin
for j:=1 to n do
write(p^[j,i],' ');
writeln;writeln;
end;
freemem(p,n*n*sizeof(integer));
end.
На матрицу:
1 2 3
1 2 3
1 2 3
любыми способами переписывания кода программы выдает
1 1 1
1 1 2
1 2 3
Помогите выявить и устранить ошибки, пожалуйста?
Был вариант решения: ввести матрицу a[i,j], затем каждый элемент присвоить итоговой матрице b[j,i]:=a[i,j]. Предварительно выделить память под каждую из них.
Решение правильное, но нерациональное в плане памяти.
Теперь пробую работать с динамическим массивом(раньше никогда и не слышал о них):
type TMas=array [0..0,0..0] of integer;
var i,j,n:integer;
p:^TMas:
begin
write('Vvedite n=');read(n);
getmem(p,n*n*sizeof(integer));{нужно, чтобы память зависела от размера квадратной матрицы}
for i:=1 to n do
for j:=1 to n do
read(p^[i,j]);
writeln('Rezultat>');
for i:=1 to n do
begin
for j:=1 to n do
write(p^[j,i],' ');
writeln;writeln;
end;
freemem(p,n*n*sizeof(integer));
end.
На матрицу:
1 2 3
1 2 3
1 2 3
любыми способами переписывания кода программы выдает
1 1 1
1 1 2
1 2 3
Помогите выявить и устранить ошибки, пожалуйста?
А не проще написать процедуру, которая будет менять содержимое двух переменных местами (например, swap), а потом сделать что-то вроде
?
Код: Выделить всё
for i:=1 to n-1 do
for j:=i+1 to n do
swap (a[i,j], a[j,i]);
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Сделал с процедурой, проswapил, получил тот же рез почему-то..
Юный Падаван
По-моему, дело в этом:
Дальше задаем вопрос, во что таком объявлении типа преобразуется обращение:
Ведь чтобы спозиционироваться на элемент массива, скажем, p^[5,10], компилятор, по сути вычисляет смещение нужного элемента как (учитывая, что индексы считаются от 0):
5 * N + 10
где N - размерность первого индекса. А она, согласно объявлению типа (0..0), равна единице !
То есть, если у тебя юзер ввел размерность (n=) 3, и ты полагаешь, что P^[3,1] покажет на 7-й элемент (1-й в 3-й строке), то фиг вам! Компилятор вычислит это как 4-й элемент массива.
Ну и плюс еще "школьная" ошибка. Индексы в обявлении типа указаны от 0, а в циклах счет столбцов/строк идет от 1.
Код: Выделить всё
type TMas=array [0..0,0..0] of integer;
var p:^TMas;
Код: Выделить всё
p^[i,j];
5 * N + 10
где N - размерность первого индекса. А она, согласно объявлению типа (0..0), равна единице !
То есть, если у тебя юзер ввел размерность (n=) 3, и ты полагаешь, что P^[3,1] покажет на 7-й элемент (1-й в 3-й строке), то фиг вам! Компилятор вычислит это как 4-й элемент массива.
Ну и плюс еще "школьная" ошибка. Индексы в обявлении типа указаны от 0, а в циклах счет столбцов/строк идет от 1.
Да, скорее всего, так оно и есть.. (( Подскажите, как быть тогда? Как задать другим способом динамический массив, please?
Юный Падаван
type TMas=array of integer;
Все массив динамический..
Все массив динамический..

И фсе? 0_о А поймет, что двумерный то?
Юный Падаван
Сорри не доглядел, тогда так
type TMas = array of array of integer;
type TMas = array of array of integer;
- annihilator
- Сообщения: 35
- Зарегистрирован: 27 ноя 2007, 00:22
не конает, пишет ошибку синтаксиса. Может компилятор не понимает, но факт остаётся фактом (поинтеры то пашут...)Duncon писал(а):Сорри не доглядел, тогда так
type TMas = array of array of integer;
Вот представьте себе: чистое поле - ни кустика, ни деревца, и вдруг из-за угла выезжает танк!
-
- Сообщения: 375
- Зарегистрирован: 31 авг 2007, 03:06
тут тема такая, что ОБЯЗАТЕЛЬНО нужно определиться - где вы пытаетесь это откомпилировать!! Динамические массивы появились только в Delphi
в TurboPascal этот код и не будет компилироваться!!
в TurboPascal этот код и не будет компилироваться!!