Предмет: Информатика,
автор: Rimrat
Найти с помощью лямбда функцию сумму элемента матрицы .
Приложения:

Ответы
Автор ответа:
0
// 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.
// Внимание! Если программа не работает, обновите версию!
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.
Автор ответа:
0
Т.е. лямбды и оператор цикла соотносятся примерно так, как язык программирования высокого уровня и ассемблер.
Автор ответа:
0
Или, совсем коротко, использование циклов с лямбдами - это архаизм.
Автор ответа:
0
Есть и расплата за это: в целом программа с циклами, перемешанными с лямбдами, как ни странно, но будет не только выглядеть длиннее, но работать медленнее, чем без циклов.
Автор ответа:
0
И еще: должны же мы "вставить Питону", и написать программу короче, чем на нем! Кстати, там операторов цикла формально нет )))
Автор ответа:
0
В смысле, операторов цикла со счетчиком, там их через диапазоны моделируют.
Похожие вопросы
Предмет: Обществознание,
автор: awwwwww0
Предмет: Русский язык,
автор: kanatabdualiev68
Предмет: История,
автор: zakiramahmudova
Предмет: Алгебра,
автор: 12345lll
Предмет: Математика,
автор: yakubovitchale