Читаем Описание языка PascalABC.NET полностью

Для множеств определены операции + (объединение), - (разность), * (пересечение), = (равенство), <> (неравенство), <= (нестрогое вложение), < (строгое вложение), >= (нестрого содержит) и > (строго содержит).

Процедура write при выводе множества выводит все его элементы. Например,

write(['Иванов','Петров','Сидорова']);

выведет ['Иванов','Петров','Сидорова'], при этом данные, если это возможно, будут отсортированы по возрастанию.

Для перебора всех элементов множества можно использовать цикл foreach, данные перебираются в некотором внутреннем порядке:

foreach s: string in fios do

write(s,' ');

Для добавления элемента x к множеству s используется конструкция s += [x] или стандартная процедура Include: Include(s,x). Для удаления элемента x из множества s используется конструкция s -= [x] или стандартная процедура Exclude: Exclude(s,x).

Процедурный тип

Тип, предназначенный для хранения ссылок на процедуры или функции, называется процедурным, а переменная такого типа - процедурной переменной. Основное назначение процедурных переменных - хранение и косвенный вызов действий (функций) в ходе выполнения программы и передача их в качестве параметров.

Описание процедурного типа


Описание процедурного типа совпадает с заголовком соответствующей процедуры или функции без имени. Например:

type

ProcI = procedure (i: integer);

FunI = function (x,y: integer): integer;

Процедурной переменной можно присвоить процедуру или функцию с совместимым типом, например:

function Mult(x,y: integer): integer;

begin

Result := x*y;

end;

var f: FunI := Mult;

Процедурной переменной можно также присвоить лямбда-выражение с соответствующим количеством параметров и типом возвращаемого значения:

var f2: FunI := (x,y) -> x+2*y;

После этого можно вызвать процедуру или функцию через эту процедурную переменную, пользуясь обычным синтаксисом вызова:

write(f(2)); // 8

write(f2(3)); // 10

Cинонимы для процедурных типов


Для наиболее распространенных процедурных типов в системном модуле определен ряд синонимов. Приведем примеры с их использованием:

var f3: IntFunc := x -> 2*x-1;

var f4: Func := x -> 2.5*x;

var f3: Action := x -> write(x,' ');

var pr: Predicate := s -> s.Length>0;

Cокращенные конструкции для процедурных типов


Для процедурных типов определены также сокращенные конструкции:

() -> T; // функция без параметров, возвращающая T

T1 -> T; // функция c параметром T1, возвращающая T

(T1,T2) -> T // функция c параметрами T1 и T2, возвращающая T

(T1,T2,T3) -> T // функция c параметрами T1, T2 и T3, возвращающая T

и т.д.

() -> (); // процедура без параметров

T1 -> T; // процедура c параметром T1

(T1,T2) -> T // процедура c параметрами T1 и T2

(T1,T2,T3) -> T // процедура c параметрами T1, T2 и T3

и т.д.

Сокращенные конструкции не могут описывать процедурные переменные с параметрами, передаваемыми по ссылке.

Для процедурных переменных принята структурная эквивалентность типов: можно присваивать друг другу и передавать в качестве параметров процедурные переменные, совпадающие по структуре (типы и количество параметров, тип возвращаемого значения).

Процедурные переменные в качестве параметров


Обычно процедурные переменные передаются как параметры для реализации обратного вызова - вызова подпрограммы через процедурную переменную, переданную в качестве параметра в другую подпрограмму:

procedure forall(a: array of real; f: real->real);

begin

forvar i := 0 to a.Length-1 do

a[i] := f(a[i]);

end;

...

forall(a,x->x*2); // умножение элементов массива на 2

forall(a,x->x+3); // увеличение элементов массива на 3

Процедурная переменная может хранить нулевое значение, которое задается константой nil. Вызов подпрограммы через нулевую процедурную переменную приводит к ошибке.

Операции += и -= для процедурных переменных


Процедурные переменные реализуются через делегаты .NET. Это означает, что они могут хранить несколько подпрограмм. Для добавления/отсоединения подпрограмм используются операторы += и -=:

Перейти на страницу:

Похожие книги

Разработка приложений в среде Linux. Второе издание
Разработка приложений в среде Linux. Второе издание

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет СЃРѕР±РѕР№ отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из РґСЂСѓРіРёС… операционных систем. РџРѕРґСЂРѕР±но рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование СЃРІРѕР±одно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Р

Майкл К. Джонсон , Эрик В. Троан

Программирование, программы, базы данных