Исправить ошибки в коде с динамической матрицей - Free Pascal
Формулировка задачи:
Здравствуйте!
Помогите разобраться с кодом, вроде всё правильно сделал, но что-то не хочет работать
Итак, я должен получить просто две равные матрицы, но я получаю следующее:
Для n=3
Почему во вторую матрицу он так выводит? Такое чувство, что при обращении к элементу он выдаёт не i,j а их сумму i+j, рассматривает двумерный массив, как одномерный :-(
Type Ttype=integer; //тип для элементов массива
mas=array [1..1,1..1] of Ttype; //тип для массива
var A: ^mas;
n,i,j,k,q: integer;
begin
write('Введите размерность матрицы ');
readln(n);
GetMem(A,n*n*Sizeof(Ttype)); //Выделяем память под матрицу А
{$R-}
writeln('Матрица А'); //Создаём и выводим массив на экран
For i:=1 to n do
begin
for j:=1 to n do
Begin
A^[i,j]:=random(201)-100; //задаём элемент массива как случайное число из диапазона -100..100
write(A^[i,j]:4); //Выводим значение
End;
writeln;
end;
writeln('Размер A в байтах: ',sizeof(integer)*n*n);
writeln;
writeln('Повторяем вывод матрицы А');
For i:=1 to n do
begin
for j:=1 to n do
Begin
write(A^[i,j]:4); //Выводим матрицу ещё раз
End;
writeln;
end;
readln;
end.| 10 19 43 |
| 69 21 72 |
| 9 70 -15 |
| 10 69 9 |
| 69 9 70 |
| 9 70 -15 |
Что-то написал и подумал. А может правильнее в данном случае задать двумерный массив как два одномерных... Первый указатель на строку, а второй сама строка. Наверное оно так и должно быть :-)
Что-то написал и подумал. А может правильнее в данном случае задать двумерный массив как два одномерных... Первый указатель на строку, а второй сама строка. Наверное оно так и должно быть :-)
В общем если кому понадобится в будущем:
Type Ttype=integer; //тип для элементов массива
PVect=^TVect;
TVect=array [1..maxint div sizeof(TType)] of Ttype; //тип для вектора и указатель на строку
PMas=^TMas;
TMas=array [1..maxint div sizeof(PVect)] of PVect; //тип для массива
var A, B: PMas;
n,i,j,k,q: integer;
begin
write('Введите размерность матрицы ');
readln(n);
GetMem(A,n*Sizeof(PVect)); //Выделяем память под матрицу А
GetMem(B,n*Sizeof(PVect)); //Выделяем память под матрицу B
for i:=1 to n do
begin
GetMem(A^[i],n*Sizeof(Ttype));
GetMem(B^[i],n*Sizeof(Ttype));
end;
GetMem(C,n*Sizeof(Ttype)); //Выделяем память под векто С
{$R-}
writeln('Матрица А'); //Создаём и выводим массив на экран
For i:=1 to n do
begin
for j:=1 to n do
Begin
A^[i]^[j]:=random(201)-100; //задаём элемент массива как случайное число из диапазона -100..100
write(A^[i]^[j]:4); //Выводим значение
End;
writeln;
end;
writeln('Размер A в байтах: ',sizeof(integer)*n*n);
writeln('Матрица B'); //Создаём и выводим массив на экран
For i:=1 to n do
begin
for j:=1 to n do
Begin
B^[i]^[j]:=random(201)-100; //задаём элемент массива как случайное число из диапазона -100..100
write(B^[i]^[j]:4); //Выводим значение
End;
writeln;
end;
writeln('Размер B в байтах: ',sizeof(integer)*n*n);
writeln;
writeln('Сумма A^T+B^T');
For i:=1 to n do
begin
for j:=1 to n do
Begin
write(A^[j]^[i]+B^[j]^[i]:4); //Выводим значение суммы транспонентный (обратный) матриц
End;
writeln;
end;
readln;
end.Решение задачи: «Исправить ошибки в коде с динамической матрицей»
textual
Листинг программы
{$R-}
uses crt;
Type Ttype=integer; //тип для элементов массива
Tmas=^TTmas;//одна строка матрицы
TTmas=array [1..1] of Ttype; //тип строки
Tmatr=^TTmatr;//матрица-массив указателей на строки
TTmatr=array[1..1] of Tmas;//тип матрицы
var A: Tmatr;
n,i,j,k,q: integer;
begin
clrscr;
write('Введите размерность матрицы ');
readln(n);
GetMem(A,Sizeof(TTmatr)*n); //Выделяем память под указатели на строки
for i:=1 to n do
Getmem(a^[i],Sizeof(Ttype)*n);//Выделяем память для эдементов строки
writeln('Матрица А'); //Создаём и выводим массив на экран
For i:=1 to n do
begin
for j:=1 to n do
Begin
A^[i]^[j]:=random(201)-100; //задаём элемент массива как случайное число из диапазона -100..100
write(A^[i]^[j]:4); //Выводим значение
End;
writeln;
end;
writeln;
writeln('Размер A в байтах: ',sizeof(Ttype)*n*n);
writeln;
writeln('Повторяем вывод матрицы А');
For i:=1 to n do
begin
for j:=1 to n do
write(A^[i]^[j]:4); //Выводим матрицу ещё раз
writeln;
end;
for i:=1 to n do
freemem(a^[i],sizeof(Ttype)*n);//освобождаем память в обратном порядке
//сначала строки
freemem(a,sizeof(TTmatr)*n);//потом указатели на них
readln
end.
Объяснение кода листинга программы
- Объявлены переменные: A, n, i, j, k, q (тип - integer), Ttype, Tmas, TTmas, Tmatr, TTmatr (тип - array)
- Выводится запрос на ввод размерности матрицы
- Считывается размерность матрицы (n)
- Выделяется память под указатели на строки матрицы (A) и на элементы строк (a^[i])
- Выводится сообщение
Матрица Аи заполняется матрица случайными числами от -100 до 100 - Выводится размер матрицы в байтах
- Выводится матрица А еще раз
- Освобождается память, начиная с элементов строк (a^[i]) и заканчивая указателями на строки (A)