Представьте себе квадрат, по которому перемещается квадрат меньшего размера. Числа, составляющие этот меньший квадрат, мы должны просуммировать. Пусть, например, n=3, m=2. Проиллюстрируем перемещение мальнького квадрата (выделен курсивом и прямоугольником) в большом:
Из этой схемы видно, что левый верхний угол прямоугольника последовательно принимает следующие координаты: (1,1) (1,2) (2,1) (2,2). Таким образом, координаты левого верхнего угла прямоугольника изменяются от 1 до n-m+1.
После определения координат левого верхнего угла нужно вычислить сумму элементов маленького квадрата, сторона которого m. При этом нужно учесть координаты левого верхнего угла маленького квадрата.
Приведем текст программы:
Program Problem33_2; Var A: Array[1..50,1..50] Of Byte; sum:Byte; m,n,i,j,k,l,nom:Byte; Begin Write('Задайте размерность матрицы: '); ReadLn(n); Write('Укажите число m, меньшее n: '); ReadLn(m); Randomize; {Заполнение массива.} For i:=1 To n Do For j:=1 To n Do A[i,j]:=1+Random(20); WriteLn('Исходный массив:'); For i:=1 To n Do Begin For j:=1 To n Do Write(A[i,j]:3); WriteLn; End; nom:=0;{Номер обрабатываемого квадрата.} For i:=1 To n-m+1 Do {Координаты левого верхнего} For j:=1 To n-m+1 Do {угла квадрата.} Begin sum:=0; {Начальное значение суммы.} For k:=i To m+i-1 Do {Вычисление суммы элементов} For l:=j To m+j-1 Do {квадрата m на m. } sum:=sum+A[k,l]; nom:=nom+1; {Номер обработанного квадрата.} WriteLn('Квадрат N',nom,', его сумма=',sum); End; End.