Исправить ошибки в коде с динамической матрицей - 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)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д