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

Раздел 3: Типы данных в языке Express

В теле схемы декларируются типы данных (Data Type). Тип данных — это множество значений некоторой величины или множество объектов (набор экземпляров). В языке Express используются следующие типы данных: сущность (Entity), простой (Simple Type), агрегативный (Aggregation Data Type), определяемый (Defined Data Type), нечисловой (Enumeration Data Type) и выделяемый (Select Data Type) типы.

Сущность — тип данных, представляющий набор концептуальных или реальных физических объектов с некоторыми общими свойствами. Сущности используют для описания объектов приложений. Свойства сущности выражают в виде атрибутов (Attributes). К характеристикам сущностей относятся также ограничения, накладываемые на значения атрибутов или на отношения между атрибутами.

Описание сущности начинается со служебного слова ENTITY, за которым следуют идентификатор сущности, описания ее атрибутов и возможно также правил. Каждый из атрибутов представлен его идентификатором и типом:
ENTITY <имя_сущности>;
<идентификатор_атрибута>:<тип_атрибута>;
...
END_ENTITY;
Например, задание прямой линии (line) в виде двух инцидентных точек р0 и р1 (атрибутов типа point) выглядит следующим образом:
ENTITY line;
p0,p1: point;
END_ENTITY;
Атрибуты и переменные сами могут быть сущностями, так тип атрибутов p0 и p1 предыдущего примера декларируется, как сущность, атрибутами которой в случае пространства 3D являются геометрические координаты x,y,z:
ENTITY point;
x,y,z: REAL;
END_ENTITY;


Рис. 1. Изображение сущности в языке Express-G

Если свойство является необязательным для данной сущности, то его выражают так называемым необязательным (optional) атрибутом. В его описании перед типом атрибута добавляется служебное слово OPTIONAL: <идентификатор_атрибута>: OPTIONAL <тип_атрибута>; Изображение атрибутов в Express-G поясняет рис. 2, из которого, в частности, следует, что атрибут представлен прямоугольником, а связи "сущность-атрибут" или "сущность-сущность" отображаются линиями, причем в случае связи с optional атрибутом используется пунктирная линия. Направление связи обозначается окружностью на конце линии, ведущей к атрибуту. Имя атрибута записывается рядом с этой линией. В прямоугольнике атрибута записывается тип атрибута.


Рис. 2. Изображение атрибутов в языке Express-G

Некоторые из атрибутов могут определяться через другие атрибуты. Тогда атрибуты, выражаемые через другие атрибуты, называют порожденными (derived), что отображается служебным словом derive в декларации атрибута. Например, описание окружности, кроме обязательных атрибутов, которыми в нижеследующем примере выбраны радиус и центр окружности, может включать порожденный атрибут площадь круга:
ENTITY point;
x,y,z: REAL;
END_ENTITY;
ENTITY circle;
center: point;
radius: REAL;
DERIVE
area: REAL := pi*radius**2;
END_ENTITY;
В этом примере использованы явные атрибуты center, radius и порожденный атрибут area.
Отметим, что между символами (* и *) записывается комментарий — произвольный текст по усмотрению автора модели. Если комментарий умещается в одной строчке, то достаточно перед его текстом поставить двойной дефис ( -- ).
К простым типам данных относятся следующие типы:
  • integer — целые числа;
  • real — вещественные числа;
  • number — тип, объединяющий типы integer и real;
  • logical — его значениями могут быть true, false или unknown (неопределенность);
  • Boolean — с возможными значениями true или false;
  • binary — последовательность битов 1 или 0;
  • string — строка символов.


Рис. 3. Изображения простых типов в языке Express-G

Изображения простых типов на языке Express-G показаны на рис. 3.
Для binary и STRING в круглых скобках можно указать максимально возможное число элементов множества, например, если строка A может включать до 24-х символов, то:
A: STRING(24);
Если строка должна содержать ровно 24 символа, то:
A: STRING(24) FIXED;
Если же ограничений на длину строки нет, то:
A: STRING;
Если переменная х имеет тип binary, то выражение х[5:7] означает биты с 5-го по 7-й в коде х.
Значения простых типов выражаются с помощью литералов. Литералы — это числа (целые, вещественные), двоичные коды, логические значения (true, false, unknown), фрагменты текста (строковый тип). Примеры записи литералов:
  • двоичный (начинается с знака %) %100101110
  • целое десятичное число 1052
  • вещественный (обязательна десятичная точка) 34.е-3 или 0.034
  • строковый (занимает не более одной строки) 'first name'
Агрегативный тип данных — множество элементов некоторого типа.
Различают четыре разновидности агрегативных типов, сведения о которых приведены в табл. 1.
Таблица 1    
Тип данныхУпорядоченностьРазличие элементов
ARRAYДаНеобязательно
BAGНетНеобязательно
LISTДаОбязательно
SETНетОбязательно

При описании типа массив (array) после слова array в квадратных скобках указываются нижняя и верхняя границы индексов. Для остальных агрегативных типов записываются не граничные значения индекса, а нижняя и верхняя границы числа элементов. Например:
F1: ARRAY[2:8] of REAL;
(* массив F1 из 7-и элементов, элементы имеют тип REAL и нумеруются, начиная с индекса 2 *);
F2: LIST[1:?] of INTEGER;
(* множество F2 содержит, по крайней мере, один элемент типа INTEGER *)
matr: ARRAY[1:10] of ARRAY[9:12] of atrac;
(* массив matr состоит из 10 четырехэлементных массивов, элементы типа atrac *)
Записи вида array[2:8] или list[1:?] в Express-G преобразуются в форму A[2:8] или L[1:?], указываемую около линии атрибута агрегативного типа после имени этого атрибута. Так, первый из вышеприведенных примеров представлен на рис. 4.


Рис. 4. Пример изображения агрегативного типа в языке Express-G

Определяемый тип данных обычно вводится пользователем для улучшения читаемости модели. Нечисловой тип — тип данных, экземплярами которого являются нечисловые (предметные) переменные. Выделяемый тип соответствует поименованной совокупности других типов. Описание этих типов данных начинается со служебного слова type, за которым следует идентификатор типа и его определение. Пример описания определяемого типа:
TYPE volume = real;
END_TYPE;
ENTITY manual;
name: STRING;
v1,v2,v3: volume;
END_ENTITY;
Определение нечислового типа начинается со служебных слов enumeration of, после которых в скобках перечисляются элементы множества. Например:
TYPE color = ENUMERATION OF (red, green, blue);
END_TYPE;
Ссылка на значение red теперь возможна в виде red или color.red.
Выделяемый тип соответствует одному из некоторого списка уже введенных типов. Этот список записывается после служебного слова select. Ссылка на имя выделяемого типа означает, что выбирается один из типов совокупности:
TYPE a_c = SELECT (one, two, three);
END_TYPE;
...
proc: a_c; (* proc может быть объектом одного из типов one, two, three *)
Графические изображения определяемых, нечисловых и выделяемых типов данных показаны на рис. 5. Внутри прямоугольников, ограничиваемых пунктирными линиями, записывается имя типа.


Рис. 5. Изображения определяемых, нечисловых и выделяемых типов данных в языке Express-G

Способ описания констант очевиден из следующего фрагмента модели:
CONSTANT
year: INTEGER := 1995;
start: date := date(12,16,1982);
(* подразумевается, что при описании типа date указаны три атрибута
 месяц, число, год *)
END_CONSTANT;
СПБГУАП,
Санкт-Петербург, 2011 год