Исправить ошибки в коде с динамической матрицей - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Помогите разобраться с кодом, вроде всё правильно сделал, но что-то не хочет работать
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.
Итак, я должен получить просто две равные матрицы, но я получаю следующее: Для n=3
10 19 43
69 21 72
9 70 -15
10 69 9
69 9 70
9 70 -15
Почему во вторую матрицу он так выводит? Такое чувство, что при обращении к элементу он выдаёт не i,j а их сумму i+j, рассматривает двумерный массив, как одномерный :-(
Что-то написал и подумал. А может правильнее в данном случае задать двумерный массив как два одномерных... Первый указатель на строку, а второй сама строка. Наверное оно так и должно быть :-)
Что-то написал и подумал. А может правильнее в данном случае задать двумерный массив как два одномерных... Первый указатель на строку, а второй сама строка. Наверное оно так и должно быть :-) В общем если кому понадобится в будущем:
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.

Объяснение кода листинга программы

  1. Объявлены переменные: A, n, i, j, k, q (тип - integer), Ttype, Tmas, TTmas, Tmatr, TTmatr (тип - array)
  2. Выводится запрос на ввод размерности матрицы
  3. Считывается размерность матрицы (n)
  4. Выделяется память под указатели на строки матрицы (A) и на элементы строк (a^[i])
  5. Выводится сообщение Матрица А и заполняется матрица случайными числами от -100 до 100
  6. Выводится размер матрицы в байтах
  7. Выводится матрица А еще раз
  8. Освобождается память, начиная с элементов строк (a^[i]) и заканчивая указателями на строки (A)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы