// PascalABC.NET 3.2, сборка 1449 от 23.05.2017
// Внимание! Если программа не работает, обновите версию!
begin
var n:=ReadInteger('Количество строк/столбцов в матрице:');
Writeln('*** Исходная матрица [',n,',',n,'] ***');
var a:=MatrRandom(n,n,-99,99);
a.Println(4); Writeln(4*a.ColCount*'-');
Writeln('S=',a.ElementsWithIndexes
.Where(y->(y[0]>=a.RowCount div 2) and (y[1]>=a.ColCount div 2))
.Select(y->y[2]).Sum)
end.
Пример
Количество строк/столбцов в матрице: 8
*** Исходная матрица [8,8] ***
-73 -79 -1 19 -58 79 -18 -81
-71 78 27 59 -6 4 -95 36
-95 -47 -94 -86 66 -37 6 12
-96 -42 -43 -78 34 -53 29 91
-65 2 59 3 -26 -16 -63 22
-4 -18 97 65 -70 78 78 9
-36 -64 8 -69 -34 74 -17 63
15 87 15 84 22 -39 -16 82
--------------------------------
S=147
Если не устраивают лямбда-выражения, а нужна именно функция, можно написать так:
type
Mat=array[,] of integer;
begin
var n:=ReadInteger('Количество строк/столбцов в матрице:');
Writeln('*** Исходная матрица [',n,',',n,'] ***');
var a:Mat:=MatrRandom(n,n,-99,99);
a.Println(4); Writeln(4*a.ColCount*'-');
var PartSum:Mat->integer;
PartSum:=x->x.ElementsWithIndexes
.Where(y->(y[0]>=x.RowCount div 2) and (y[1]>=x.ColCount div 2))
.Select(y->y[2]).Sum;
Writeln('S=',PartSum(a))
end.