<em>// PascalABC.NET 3.2, сборка 1415 от 25.03.2017</em>
<em>// Внимание! Если программа не работает, обновите версию!</em>
function MatRead(var n:integer):array[,] of integer;
// функция создает и возвращает квадратную матрицу n*n,
// элементы которой вводятся к склавиатуры.
// Она фактически не нужна в этой версии Паскаля,
// потому что уже встроена, но раз просят...
begin
Result:=ReadMatrInteger(n,n)
end;
function MatSum(a,b:array[,] of integer):array[,] of integer;
begin
var n:=a.RowCount-1;
SetLength(Result,n+1,n+1);
for var i:=0 to n do
for var j:=0 to n do
Result[i,j]:=a[i,j]+b[i,j]
end;
procedure MatPrint(a:array[,] of integer; p:integer);
// вывод матрицы a в p позициях
// И эта процедура фактически не нужна, но присутствует
// из-за требований задачи.
begin
a.Println(p)
end;
begin
var n:=ReadInteger('n=');
Writeln('Введите элементы матрицы А');
var a:=MatRead(n);
Writeln('Введите элементы матрицы B');
var b:=MatRead(n);
MatPrint(MatSum(Transpose(a),b),4);
Writeln;
MatPrint(MatSum(Transpose(b),a),4)
end.
<u>Пример</u>
n= 3
Введите элементы матрицы А
1 2 3 4 5 6 7 8 9
Введите элементы матрицы B
18 17 16 15 14 13 12 11 10
19 21 23
17 19 21
15 17 19
19 17 15
21 19 17
23 21 19
LINQ - технология доступа к данным, разработанная Microsoft для среды .NET. Первоначально применялась при работе с базами данных, позднее была обобщена, позволяя работать с объектами программного кода (LINQ to Objects).
В PascalABC.NET 3.х на базе LINQ to Objects реализованы элементы функционального программирования, для понимания работы которых нужно быть знакомым с "лямбдами" - λ-выражениями, λ-функциями и λ-процедурами. Эти элементы могут применяться к объектам программы, которые поддерживают интерфейс IEnumerable из .NET Framework. Говоря проще, к массивам, спискам, стекам, очередям, словарям - любым динамическим объектам, реализованным на базе последовательностей. И, конечно же, к самим последовательностям.
Последовательность - это новшество для Паскаля, пришедшее из функционального программирования. Главная особенность последовательности в том, что она не хранится в памяти. Вместо этого хранятся а) программный код, позволяющий вычислить любой элемент последовательности и б) значение текущего элемента последовательности, с которым производится операция. Это позволяет работать с последовательностями любой длины, в том числе, с бесконечными. Операторы LINQ обрабатывают входные данные и на выходе всегда возвращают последовательность. Многие начинающие программисты забывают об этом, что порождает ошибки, временами, с маловразумительной диагностикой.
В PascalABC.NET 3.x операции LINQ реализованы в виде расширений соответствующих классов, поэтому в записи используется "точечная форма".
В функциональном программировании имеются, в частности, операции проекция, фильтрация и свертка. С их помощью можно просто и наглядно решать достаточно широкий круг задач.
Фильтрация Where, примененная к последовательности, пропускает на выход лишь элементы, удовлетворяющие заданному условию (для которых это условие истинно). Условие задается в виде лямбды.
Например, a.Where(t->(t>0) and t.IsOdd) породит последовательность из положительных нечетных элементов а (a - массив и т.д.).
Проекция Select, примененная к последовательности, преобразует каждый ее элемент к значению по правилу, заданному "лямбдой".
Например, a.Select(t->3*sin(t)+5*Cos(2*t)) породит последовательность, каждый член которой будет вычислен как значение функции f(x)=3Sin(x)+5Cos(2x).
Свертка Aggregate заменяет оператор цикла, сворачивая последовательность до одного значения. Это разного рода суммы, произведения и т.п. В простейшем случае используются два параметра, первый из которых определяет начальное значение, а второй является лямбдой, задающий операцию между предыдущим и текущим значениями.
a.Aggregate(1,(x,y)->x*y) свернет элементы a в произведение,
a.Aggregate(0,(x,y)->x+y) свернет элементы a в сумму.
Кроме трех упомянутых операций, LINQ предоставляет также разбиение, объединение, конкатенацию, группировку, упорядочивание и прочее.
"Точечная" нотация PascalABC.NET 3.x позволяет стоить из операций длинные цепочки, что повышает эффективность программ из-за отсутствия промежуточных переменных.
<u>Пример:</u>
SeqGen(15,i->3*i*i-5,10).Where(t->t.IsEven).Select(t->t/10).OrderBy(t->t).Println;
Здесь генерируется последовательность из 15 элементов по формуле
a = 3i²-5, где i=10,11,12,.. Полученная последовательность фильтруется по правилу, пропускающему только элементы с четными значениями. Результат проецируется на последовательность вещественных элементов путем деления каждого исходного элемента на 10. Полученная последовательность упорядочивается по возрастанию и выводится на монитор: 35.8 50.2 67 86.2 107.8 131.8 158.2
//PascalABC.NET (версия 3.1, сборка 1196 от 09.03.2016)
const n = 10;
begin
var a:=ArrRandom(n,-10,10);
a.Println;
var b:=ArrRandom(n,-10,10);
b.Println;
var c:array[0..n-1] of integer;
for var i:=0 to 9 do c[i]:=a[i]+b[i];
c.println;
end.
Условию
(x <= 11) И (x > 8) удовлетворяют 3 целых числа: 9 ,10 и 11.
А вот условию:
(x <= 3) удовлетворяют целые числа: 3, 2, 1, 0, -1, -2 и так далее до минус бесконечности.
Между рассмотренными условиями стоит союз ИЛИ, значит ответ:
бесконечное множество целых чисел