Представьте себе квадрат, по которому перемещается квадрат меньшего размера. Числа, составляющие этот меньший квадрат, мы должны просуммировать. Пусть, например, 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.
Текст этой программы можно взять здесь.