[ домой ] [ следующий ] [ начало главы ] [ предыдущий ] [ содержание ]

Пример 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 до N 
      S:=S+A[i, j] 
    кц 
    если S<>St                 |сравнение суммы элементов текущего 
      то Flag:="Нет"           |столбца с эталонной суммой 
      иначе j:=j+1 
    все 
  кц
  если Flag="Да" 
    то S:=0 | вычисление суммы элементов побочной диагонали 
      нц для i от 1 до N 
        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 : DIM A(N, 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

[ домой ] [ следующий ] [ начало главы ] [ предыдущий ] [ содержание ]