Проверить, является ли заданная целочисленная матрица A(N, N) «магическим квадратом» — Pascal(Паскаль)

{  Пример 6.3. Проверить является ли заданная целочисленая матрица А(N,N)
              "магическим квадратом" (это значит, что суммы чисел во всех
               ее строках,  всех столбцах  и двух диагоналях  одинаковы).

                                  Система тестов
           ╔══════╤═════════════╤═════════════════╤════════════════╗
           ║ Номер│ Проверяемый │     Данные      │                ║
           ║ теста│   случай    ├───┬─────────────┤   Результат    ║
           ║      │             │ N │  Матрица А  │                ║
           ╟──────┼─────────────┼───┼─────────────┼────────────────╢
           ║   1  │  Является   │ 3 │  1  2  3    │  "Магический   ║
           ║      │             │   │  4  2  0    │    квадрат"    ║
           ║      │             │   │  1  2  3    │                ║
           ╟──────┼─────────────┼───┼─────────────┼────────────────╢
           ║   2  │ Не является │ 2 │   2  1      │ "Не магический ║
           ║      │             │   │   1  2      │    квадрат"    ║
           ╚══════╧═════════════╧═══╧═════════════╧════════════════╝
}
  Program MagicSquare;
    Uses Crt;
    Var A           : Array [1..20, 1..20] of Integer;
        i, j, N     : Integer;
        Standard, S : Integer; { Standard - сумма-эталон, S - текущая сумма }
        Flag        : Boolean;
  {-------------------------------------}
  Procedure InputOutput; { описание процедуры ввода-вывода матрицы }
   Begin
     ClrScr;
     Write('Количество строк и столбцов - ');
     ReadLn(N);
     For i := 1 to N do
       For j := 1 to N do
         begin Write('A[' , i , ', ' , j , '] = ');
           ReadLn(A[i, j])
         end;

     ClrScr;
     WriteLn('Исходная матрица :'); WriteLn;
     For i := 1 to N do
       begin
         For j := 1 to N do Write(A[i, j] : 5);
         WriteLn
       end; WriteLn
   End; { of InputOutput }
  {-------------------------------------------}
  Procedure MagicOrNot(Var Flag : Boolean); { описание процедуры, в которой
                               выясняется, является ли квадрат "магическим" }
   Begin  { вычисление суммы элементов главной   }
          { диагонали в качестве эталонной суммы }
     Standard:=0;
     For i := 1 to N do Standard := Standard+A[i, i];

     Flag:=TRUE; i:=1;
     While (i<=N) and Flag do { вычисление сумм элементов строк }
       begin
         S:=0;
         For j := 1 to N do S := S+A[i, j];
         If S<>Standard then Flag := FALSE else i:=i+1
       end;

     j:=1;
     While (j<=N) and Flag do { вычисление сумм элементов столбцов }
       begin
         S:=0;
         For i := 1 to N do S:=S+A[i, j];
         If S<>Standard then Flag := FALSE else j := j+1
       end;

     If Flag then
       begin
         S:=0;     { вычисление суммы элементов побочной диагонали }
         For i := 1 to N do S := S+A[i, N+1-i];
         If S<>Standard then Flag := FALSE;
       end;
   End;
  {--------------------------------------------------------}
  BEGIN
    InputOutput;      { Вызов процедуры ввода-вывода   }
    MagicOrNot(Flag); { Вызов процедуры решения задачи }
    If Flag then WriteLn('Это магический квадрат.')
            else WriteLn('Это не магический квадрат.');
    ReadLn
  END.

Leave a Comment

9 + 1 =