Определить, является ли матрица магическим квадратом, используя динамические переменные - Turbo Pascal

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

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

Как реализовать программу для определения, является ли матрица магическим квадратом, т.е. сумма всех строк=сумме всех столбцов, используя динамические переменные и getmem, freemem

Решение задачи: «Определить, является ли матрица магическим квадратом, используя динамические переменные»

textual
Листинг программы
uses crt;
const nmax=20;
type
  Tmas=^TTmas;{одна строка матрицы}
  TTmas=array[1..1] of integer;
  Tmatr=^TTmatr;{матрица-массив указателей на строки}
  TTmatr=array[1..1] of Tmas;
var
  a:Tmatr;
  n,i,j,s,s1,s2:integer;
  f:boolean;
begin
clrscr;
randomize;
repeat
write('Размер матрицы до ',nmax,' n=');
readln(n);
until n in [1..nmax];
getmem(a,sizeof(TTmatr)*n);{выделяем память под указатели на строки}
for i:=1 to n do
getmem(a^[i],sizeof(integer)*n);{для каждой строки память для хранения данных}
writeln('Введите элементы матрицы, целые числа');
for i:=1 to n do
for j:=1 to n do
 begin
  write('a[',i,',',j,']=');
  readln(a^[i]^[j]);
 end;
clrscr;
writeln ('Исходная матрица:');
s:=0;
for i:=1 to n do
 begin
  for j:=1 to n do
   begin
    write(a^[i]^[j]:4);
    if i=1 then s:=s+a^[i]^[j];{найдем сумму в перой строке}
   end;
  writeln;
 end;
f:=true;
i:=1;
while(i<=n)and f do
 begin
  s1:=0;
  s2:=0;
  for j:=1 to n do
   begin
    s1:=s1+a^[i]^[j];
    s2:=s2+a^[j]^[i];
   end;
  if(s1<>s)or(s2<>s) then f:=false
  else i:=i+1;
 end;
if f then write('Суммы всех строк и столбцов равны')
else write('Это не магический квадрат');
for i:=1 to n do
freemem(a^[i],sizeof(integer)*n); {освобождаем память в обратном порядке, сначала удалим строки}
freemem(a,sizeof(TTmatr)*n); {потом указатели на них}
readln
end.

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

  1. В начале программы подключается библиотека crt, которая обеспечивает функции для работы с памятью и вводом/выводом.
  2. Затем определяются константа nmax, тип данных TTmas и TTmatr, а также переменные a, n, i, j, s, s1, s2.
  3. Переменная a инициализируется как массив указателей на строки.
  4. Далее, в цикле повторяется до тех пор, пока размер матрицы не будет в пределах от 1 до nmax. Выводится запрос на ввод размера матрицы, а затем выделяется память под указатели на строки.
  5. После этого, в цикле for i=1 до n do for j=1 до n do вводятся элементы матрицы.
  6. Выводится исходная матрица.
  7. Запускается цикл while, который проверяет, равны ли суммы строк и столбцов. Если это так, выводится сообщение Суммы всех строк и столбцов равны, иначе выводится сообщение Это не магический квадрат.
  8. По завершении цикла while, освобождается память под строки и указатели на них.

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

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