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