Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SAOD..doc
Скачиваний:
142
Добавлен:
11.05.2015
Размер:
959.49 Кб
Скачать

2.6 Записи с вариантами

На практике часто оказывается удобным рассматривать два типа как варианты одного и того же типа. На­пример, в геометрии можно использовать декартовы или полярные координаты точки на плоскости. Эти коор­динаты можно считать типом, объединяющим два варианта записи, компонентами которой являются:

а)две длины;

б)длина и угол.

Для того, чтобы определить, какой вариант в данный момент принят, вводится третья компонента. Она на­зывается дескриптором типа или полем признака. Например,

TYPE COORD = RECORD

CASE KIND : (DEC, POL) OF DEC : (X, Y : REAL); POL : (R, FI : REAL) END; Здесь имя поля признака – KIND, а имена координат либо X и Y в случае DEC, либо R и FI в случае POL. Множество значений типа COORD есть объединение двух типов: T1 = (X, Y : REAL) T2 = (R, FI : REAL), а его кардинальное число равно сумме кардинальных чисел T1 и T2.

Однако чаще всего приходится объединять не два полностью различных типа, а два типа с частично сов­падающими компонентами.

Например, в анкетных данных работников в зависимости от пола могут записываться разные существен­ные характеристики. Для мужчин в какой-то ситуации могут быть существенными вес и наличие бороды, для женщины – три основных её размера (тогда как вес она может хранить в тайне). Тогда получим следующее описание типа:

TYPE ALFA = STRING[1..15]; TYPE PERSON = RECORD

FA, IM, OT : ALFA; DATR : DATE; ROST : INTEGER; CASE POL : (M, W) OF M : (WES : REAL;

BOR : BOOLEAN); W : (SIZE : ARRAY[1..3] OF INTEGER) END; Общий вид описания составного типа с вариантами: TYPE T = RECORD S1 : T1; ... ; SN-1 : TN-1; { общая часть } CASE SN : TN OF

C1 : (S11 : T11; ... ; S1 N1 : T1 N1);

CM : (SM1 : TM1; ... ; SM NM : TM NM) END Вариантная часть всегда должна быть последней в записи. Допускаются вложенные друг в друга вариант­ные части записей.

Здесь Si, Sij – селекторы компонент, принадлежащих к типам Ti и Tij, а Sn - имя поля признака. Переменная x типа T состоит из компонент X.S1, X.S2, ... , X.SN, X.SK1, ... , X.SK,NK

когда текущее значение X.SN = CK. В противном случае – ошибка (бородатая женщина). При использовании записей с вариантами лучше всего действия, связанные с каждым из вариантов, груп­пировать в выбирающем секторе, так называемом операторе вариантов. Его структура отражает структуру опи­сания записи с вариантами: CASE X.SN OF C1 : S1; C2 : S2;

CM : SM END;

S1, S2, ..., SM - исполняемые операторы.

Пусть, например, нужно вычислить расстояние между точками А и В, заданными переменными типа COORD. В зависимости от того, являются координаты одной или двух точек декартовыми или полярными, формулы для вычисления будут различными. Всего получим 4 варианта: VAR A,B : COORD; D : REAL; CASE A.KIND OF

DEC : CASE B.KIND OF

DEC : D:=SQRT(SQR(A.X-B.X)+SQR(A.Y-B.Y)); POL : D:=SQRT(SQR(A.X-B.R*COS(B.FI))+SQR(A.Y-B.R*SIN(B.FI))) END;

POL : CASE B.KIND OF

DEC : D:=SQRT(SQR(A.R*COS(A.FI)-B.X)+SQR(A.R* SIN(A.FI)-B.X)); POL : D:=SQRT(SQR(A.R+SQR(B.R)-2*A.R*B.R* COS(B.FI-A.FI))

END END

Представление записей в памяти ЭВМ

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

Адрес какой-либо компоненты (поля) записи относительно начального адреса R называется смещением поля Ki. Оно вычисляется по формуле

Ki = S1 + S2 + ... + Si-1, где Sj - размер j-й компоненты в словах.

Для массива Ki = (I-1)S, т.к. все длины одинаковы.

Доступ к компонентам записи ограничен - можно пользоваться лишь фиксированными идентификатора­ми. Это ограничение позволяет узнать относительные адреса во время трансляции, что увеличивает эффектив­ность доступа к записям.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]