Определить, является ли матрица магическим квадратом, используя динамические переменные - 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.
Объяснение кода листинга программы
- В начале программы подключается библиотека crt, которая обеспечивает функции для работы с памятью и вводом/выводом.
- Затем определяются константа nmax, тип данных TTmas и TTmatr, а также переменные a, n, i, j, s, s1, s2.
- Переменная a инициализируется как массив указателей на строки.
- Далее, в цикле повторяется до тех пор, пока размер матрицы не будет в пределах от 1 до nmax. Выводится запрос на ввод размера матрицы, а затем выделяется память под указатели на строки.
- После этого, в цикле for i=1 до n do for j=1 до n do вводятся элементы матрицы.
- Выводится исходная матрица.
- Запускается цикл while, который проверяет, равны ли суммы строк и столбцов. Если это так, выводится сообщение
Суммы всех строк и столбцов равны
, иначе выводится сообщениеЭто не магический квадрат
. - По завершении цикла while, освобождается память под строки и указатели на них.