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

Система тестов

Номер теста Проверяемый случай Данные Результат
N Матрица А Otvet
1 Является 3 ''Магический квадрат''
2 Не является 2 ''Не магический квадрат ''

Демонстрация


Школьный АЯ
алг Магический квадрат (арг цел N, арг цел таб A[1:N, 1:N], рез лит Otvet)
    дано | N>0
нач цел i, j, St, S, лит Flag 
  St:=0              | вычисление суммы элементов главной диагонали 
  нц для i от 1 до N | в качестве эталонной суммы St 
    St:=St+A[i, i] 
  кц
  Flag:="Да"; i:=1 
  нц пока (i<=N) и (Flag="Да") | вычисление сумм элементов строк 
    S:=0 
    нц для j от 1 до N 
      S:=S+A[i, j] 
    кц 
    если S<>St | сравнение суммы элементов текущей строки с эталонной 
      то Flag:="Нет" 
      иначе i:=i+1 
    все 
  кц
  j:=1 
  нц пока (j<=N) и (Flag="Да") | вычисление сумм элементов столбцов 
    S:=0 
    нц для i от 1 до
      S:=S+A[i, j] 
    кц 
    если S<>St                 |сравнение суммы элементов текущего 
      то Flag:="Нет"           |столбца с эталонной суммой 
      иначе j:=j+1 
    все 
  кц
  если Flag="Да" 
    то S:=0 | вычисление суммы элементов побочной диагонали 
      нц для i от 1 до
        S:=S+A[i, N+1-i] 
      кц 
      если S<>St | сравнение суммы с эталонной 
        то Flag:="Нет" 
      все 
  все 
  если Flag="Да" 
    то Otvet := "Это магический квадрат." 
    иначе Otvet := "Это не магический квадрат." 
  все 
конБлок-схема (фрагмент)

Вычисление суммы 
элементов главной 
диагонали в качестве 
эталонной суммы
Вычисление сумм 
элементов строк и 
сравнение их с 
эталонной суммой 
 
 
 

 


Блок-схема (продолжение)

 

Вычисление сумм 
элементов столбцов

и сравнение их с 
эталонной суммой 

 

 

 

 
Вычисление суммы 

элементов побочной 
диагонали и сравнение 
ее с эталонной суммой

Исполнение алгоритма
(в таблице отражен только конечный результат

работы циклов типа для, в которых вычисляются суммы)

Обозначения проверяемых условий:
(i<=N) и (Flag = "ДА" )
=> (1)
(j<=N) и (Flag = "ДА" )
=> (2)
 Flag = "ДА"  => (3)

 

теста
St Flag i (1) j (2) (3) S S<>St Otvet

1
6 "Да" 1
2

3

1,2,3

1,2,3

1,2,3

1,2,3
+
+

+
1,2,3
1,2,3

1,2,3

1

2

3
 
 
+
+

+
 
 
+
6
6

6

6

6

6

6
-
-

-

-

-

-

-

 
 
"Магический квадрат"
2 4 "Да"
"Нет"
1 +
-(кц)
1,2
1
-(кц) - 3 + "Не магический квадрат"

Turbo Pascal
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.


QBasic

CLS : INPUT "Количество строк и столбцов - ", N 
FOR i = 1 TO N 
  FOR j = 1 TO N 
    PRINT "A(" ; i ; ", " ; j ; ") = "; : INPUT A(i, j) 
  NEXT j 
NEXT i : CLS

PRINT "Исходная матрица: " : PRINT 
FOR i = 1 TO N 
  FOR j = 1 TO N 
    PRINT A(i, j); 
  NEXT j : PRINT 
NEXT i : PRINT

Standard = 0 'вычисление суммы-эталона Standard 
FOR i = 1 TO N 
   Standard = Standard + A(i, i) 
NEXT i

Flag = 1 : i = 1 
WHILE
(i <= N) AND (Flag = 1) 'вычисление сумм элементов строк 
  S = 0 
  FOR j = 1 TO N 
    S = S + A(i, j) 
  NEXT j 
  IF
S <> Standard THEN Flag = 0 ELSE i = i + 1 
WEND

j = 1 
WHILE
(j <= N) AND (Flag = 1) 'вычисление сумм элементов столбцов 
  S = 0 
  FOR i = 1 TO N 
    S = S + A(i, j) 
  NEXT i 
  IF
S <> Standard THEN Flag = 0 ELSE j = j + 1 
WEND

IF Flag = 1 THEN 
  S = 0 'вычисление суммы элементов побочной диагонали 
  FOR i = 1 TO N 
    S = S + A(i, N + 1 - i) 
  NEXT i 
END IF  
IF
S <> Standard THEN Flag = 0
IF Flag = 1 THEN PRINT "Это магический квадрат." 
  ELSE PRINT "Это не магический квадрат." 
END IF : PRINT 
END

Другие записи

10.06.2016. Пример 6.4. Дана матрица A(N, N). Если хотя бы один элемент строки матрицы отрицателен, то все элементы этой строки заменить нулями.
Тест Данные Результат N Матрица А Матрица А 3   Школьный АЯ (в этом алгоритме отражены процессы  ввода  исходных данных и вывода результатов ) алг Модификация(арг…