Список разделов О факультете Специальности факультета Контакты

Раздел 3: Язык Express: процедуры и функции

Процедуры и функции в языке Express служат для описания процедурной части модели. Как и в алгоритмических языках, используется концепция формальных и фактических параметров. Описание процедуры начинается с служебного слова procedure, за которым следуют идентификатор процедуры и описание формальных параметров в круглых скобках.

Пример описания заголовка процедуры:
PROCEDURE eq (x,y: REAL; n: INTEGER; VAR RESULT: route);
Аналогично описываются функции, их отличает только описание в заголовке типа результата после закрывающей скобки:
FUNCTION log (a: REAL; m: INTEGER): REAL;
Локальные переменные, описанные в блоке действуют только в пределах данных функции или процедуры:
LOCAL
...
END_LOCAL;
Ряд функций и процедур относится к стандартным и потому не требует описания во вновь разрабатываемых моделях. Отметим следующие стандартные функции: Abs — абсолютная величина; Sqrt — корень квадратный; Exp — экспонента; Log, Log2, Log10 — логарифмы натуральный, двоичный, десятичный соответственно; Sin, Cos, Tan, Acos, Asin, Atan — тригонометрические и обратные тригонометрические функции sin, cos, tg, arc cos, arc sin, arc tg.
В число стандартных входят также функции: BLength — подсчет числа бит в двоичном коде; HiBound — верхняя граница индекса у array или верхняя граница числа элементов у set, bag, list; LoBound — то же в отношении нижних границ; Length — подсчет числа символов в строке; Odd — возвращает значение true, если аргумент — нечетное число; SizeOf — возвращает число элементов в объекте агрегативного типа; TypeOf — возвращает список типов, к которым принадлежит параметр этой функции; Exists — возвращает значение true, если аргумент этой функции входит в число атрибутов соответствующей сущности и др.
К стандартным процедурам относятся процедуры Insert и Remove — вставка или изъятие элемента в заданной позиции у объекта агрегативного типа соответственно.
При описании алгоритмов в телах процедур и функций могут использоваться операторы пустой (Null), присваивания (Assignment), выбора (Case), составной (Compound Statement), условный (if..then..else), цикла (Repeat), выхода из функции или процедуры (Return), перехода на конец цикла (Skip).
В выражениях используются операнды, знаки операций, вызовы функций. Так, для арифметических операций над числами типа real применяются следующие знаки: * — умножение, / — деление, DIV — целочисленное деление, + — сложение, - — вычитание, ** — возведение в степень, MOD — деление по модулю.
Знаки логических операций: not — отрицание, and — конъюнкция, or — дизъюнкция, xor — исключающее ИЛИ. В применении к величинам типа logical эти операции выполняются по правилам действий в трехзначном алфавите. Логическое выражение a1 in a2 принимает значение true, если a1 содержится в a2. Оператор like используется для посимвольного сравнения строк. Знаки отношений равно =, не равно <>, больше >, меньше <, больше или равно >=, меньше или равно <=. Для сравнения экземпляров сущностей используют операции "равно" и "неравно" со знаками :=: и :<>: соответственно.
Операции над множествами (типами bag и set) — пересечение (Intersection), объединение (Union), разность (Difference). Их знаки суть * (умножение), + (плюс), — (минус) соответственно. Оператор Query (A <* B | C) возвращает подмножество тех элементов из агрегативного типа B, для которых выполняется условие C, здесь A — простая переменная, используемая в C.
Знак + (плюс) по отношению к операндам типа binary или string есть знак конкатенации.
В качестве формальных параметров процедур и функций, кроме типов данных, применяемых в других конструкциях языка и охарактеризованных выше, могут использоваться обобщенные типы: generic, aggregate и некоторые другие. Тип generic формального параметра означает, что соответствующий фактический параметр может иметь любой тип данных из числа предусмотренных при описании процедуры. Аналогично тип aggregate обобщает агрегативные типы данных — array, bag, list, set. Например:
Пример 1
FUNCTION add (a,b: GENERIC: intype): GENERIC: intype;
LOCAL
nr: number;
vr: vector;
END_LOCAL;
IF ('number' IN TYPEOF (a)) AND ('number' IN TYPEOF (b))
THEN nr := a+b;
(* функция typeof (a) возвращает тип аргумента а и,
   если этот тип есть number, то первый операнд логического выражения равен true *)
RETURN (nr);
ELSE
IF ('this schema.vector' IN TYPEOF (a)) AND ('this schema.vector' IN TYPEOF (b)) THEN
vr.i := a.i + b.i;
vr.j := a.j + b.j;
vr.k := a.k + b.k;
(* подразумевается, что декларация типа vector
   была произведена в схеме с именем this schema *)
RETURN (vr);
END_IF;
END_IF;
END_FUNCTION;
В языке Express-G специальные символы для изображения правил, процедур и функций не оговорены.
СПБГУАП,
Санкт-Петербург, 2011 год