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

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

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

Здравствуйте! Помогите разобраться с кодом, вроде всё правильно сделал, но что-то не хочет работать
Листинг программы
  1. Type Ttype=integer; //тип для элементов массива
  2. mas=array [1..1,1..1] of Ttype; //тип для массива
  3. var A: ^mas;
  4. n,i,j,k,q: integer;
  5. begin
  6. write('Введите размерность матрицы ');
  7. readln(n);
  8. GetMem(A,n*n*Sizeof(Ttype)); //Выделяем память под матрицу А
  9. {$R-}
  10. writeln('Матрица А'); //Создаём и выводим массив на экран
  11. For i:=1 to n do
  12. begin
  13. for j:=1 to n do
  14. Begin
  15. A^[i,j]:=random(201)-100; //задаём элемент массива как случайное число из диапазона -100..100
  16. write(A^[i,j]:4); //Выводим значение
  17. End;
  18. writeln;
  19. end;
  20. writeln('Размер A в байтах: ',sizeof(integer)*n*n);
  21.  
  22. writeln;
  23. writeln('Повторяем вывод матрицы А');
  24. For i:=1 to n do
  25. begin
  26. for j:=1 to n do
  27. Begin
  28. write(A^[i,j]:4); //Выводим матрицу ещё раз
  29. End;
  30. writeln;
  31. end;
  32. readln;
  33. 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, рассматривает двумерный массив, как одномерный :-(
Что-то написал и подумал. А может правильнее в данном случае задать двумерный массив как два одномерных... Первый указатель на строку, а второй сама строка. Наверное оно так и должно быть :-)
Что-то написал и подумал. А может правильнее в данном случае задать двумерный массив как два одномерных... Первый указатель на строку, а второй сама строка. Наверное оно так и должно быть :-) В общем если кому понадобится в будущем:
Листинг программы
  1. Type Ttype=integer; //тип для элементов массива
  2. PVect=^TVect;
  3. TVect=array [1..maxint div sizeof(TType)] of Ttype; //тип для вектора и указатель на строку
  4. PMas=^TMas;
  5. TMas=array [1..maxint div sizeof(PVect)] of PVect; //тип для массива
  6. var A, B: PMas;
  7. n,i,j,k,q: integer;
  8. begin
  9. write('Введите размерность матрицы ');
  10. readln(n);
  11. GetMem(A,n*Sizeof(PVect)); //Выделяем память под матрицу А
  12. GetMem(B,n*Sizeof(PVect)); //Выделяем память под матрицу B
  13. for i:=1 to n do
  14. begin
  15. GetMem(A^[i],n*Sizeof(Ttype));
  16. GetMem(B^[i],n*Sizeof(Ttype));
  17. end;
  18. GetMem(C,n*Sizeof(Ttype)); //Выделяем память под векто С
  19. {$R-}
  20. writeln('Матрица А'); //Создаём и выводим массив на экран
  21. For i:=1 to n do
  22. begin
  23. for j:=1 to n do
  24. Begin
  25. A^[i]^[j]:=random(201)-100; //задаём элемент массива как случайное число из диапазона -100..100
  26. write(A^[i]^[j]:4); //Выводим значение
  27. End;
  28. writeln;
  29. end;
  30. writeln('Размер A в байтах: ',sizeof(integer)*n*n);
  31. writeln('Матрица B'); //Создаём и выводим массив на экран
  32. For i:=1 to n do
  33. begin
  34. for j:=1 to n do
  35. Begin
  36. B^[i]^[j]:=random(201)-100; //задаём элемент массива как случайное число из диапазона -100..100
  37. write(B^[i]^[j]:4); //Выводим значение
  38. End;
  39. writeln;
  40. end;
  41. writeln('Размер B в байтах: ',sizeof(integer)*n*n);
  42. writeln;
  43. writeln('Сумма A^T+B^T');
  44. For i:=1 to n do
  45. begin
  46. for j:=1 to n do
  47. Begin
  48. write(A^[j]^[i]+B^[j]^[i]:4); //Выводим значение суммы транспонентный (обратный) матриц
  49. End;
  50. writeln;
  51. end;
  52. readln;
  53. end.

Решение задачи: «Исправить ошибки в коде с динамической матрицей»

textual
Листинг программы
  1. {$R-}
  2. uses crt;
  3. Type Ttype=integer; //тип для элементов массива
  4.      Tmas=^TTmas;//одна строка матрицы
  5.      TTmas=array [1..1] of Ttype; //тип строки
  6.      Tmatr=^TTmatr;//матрица-массив указателей на строки
  7.      TTmatr=array[1..1] of Tmas;//тип матрицы
  8. var A: Tmatr;
  9.     n,i,j,k,q: integer;
  10. begin
  11.   clrscr;
  12.   write('Введите размерность матрицы ');
  13.   readln(n);
  14.   GetMem(A,Sizeof(TTmatr)*n); //Выделяем память под указатели на строки
  15.   for i:=1 to n do
  16.   Getmem(a^[i],Sizeof(Ttype)*n);//Выделяем память для эдементов строки
  17.   writeln('Матрица А'); //Создаём и выводим массив на экран
  18.   For i:=1 to n do
  19.    begin
  20.     for j:=1 to n do
  21.      Begin
  22.       A^[i]^[j]:=random(201)-100; //задаём элемент массива как случайное число из диапазона -100..100
  23.       write(A^[i]^[j]:4); //Выводим значение
  24.      End;
  25.     writeln;
  26.   end;
  27.   writeln;
  28.   writeln('Размер A в байтах: ',sizeof(Ttype)*n*n);
  29.   writeln;
  30.   writeln('Повторяем вывод матрицы А');
  31.   For i:=1 to n do
  32.    begin
  33.     for j:=1 to n do
  34.     write(A^[i]^[j]:4); //Выводим матрицу ещё раз
  35.     writeln;
  36.    end;
  37.   for i:=1 to n do
  38.   freemem(a^[i],sizeof(Ttype)*n);//освобождаем память в обратном порядке
  39.                                  //сначала строки
  40.   freemem(a,sizeof(TTmatr)*n);//потом указатели на них
  41.   readln
  42. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы