Главная  Терминология Хоора 

1 2 3 4 5 6 7 8 9 10 [ 11 ] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Общий йид описания составного типа с вариантами:

type Г ==

records, :ri;...;5 ,:r i; case s : Т„ of

(1.24)

Здесь Si и Sif - селекторы компонент, принадлежащих к типам компонент Ti и Тц, а s - имя различающего поля признака типа Тп. Переменная х типа Т состоит из компонент

X.Si, X.S2, X.S , X.Sk. 1,

в том и только том случае, когда текущее значение x.Sn - Ck-Компоненты x.su x.Sn составляют общую часть т вариантов.

Таким образом, использование селектора x.Sft , (1: А nk) при x.Sn ф Си следует рассматривать как серьезную ошибку программирования. Это может например, означать (для типа Person, определенного выше,) проверку, является ли некая леди бородатой, или (в случае выборочного присваивания) приписывание ей этого свойства!

Поэтому при использовании записей с вариантами требуется особое внимание. Лучше всего действия, связанные с каждым из вариантов, группировать в выбирающем селекторе, так называемом операторе варианта; его структура отражает структуру описания типа записи с вариантами:

case x.s of

(1.25)

Оператор Sk выполняется в случае, когда для х выбирается /г-й вариант, т. е. поле признака x.s принимает значение с^. Следовательно, для того чтобы предотвратить неправильное использование селекторов, нужно следить, чтобы каждый Sk содержал только селекторы

и



В следующем небольшом фрагменте программы вычисляется расстояние между двумя точками А н В, заданными переменными а и b типа Coordinate (запись с вариантами). Способ вычисления выбирается в зависимости от четырех воз-

у

а.х а

Э.Г / 1 \

/ la.y \

\ в

\b.y

Рис. 1.4. Декартовы и полярные координаты.

можных комбинаций декартовых и полярных координат (см. рис. 1.4).

case a.kind of

Cartesian: case b.kind of

Cartesian: d := sqrt(sqria.x-b.x)+sqr{a.y-b.y)y. Polar: d := sqrt{sqr{a.x-b.r*cos(b.<p) -]-sqr{a.y-b.r*sin{b.y)

end;

Polar: case b.kind of

Cartesian: d := sqrt(sqr(a.r*cos(a.(p)-b.x)

-\-sqr{a.r*sinia.qi)-b.y)). Polar:. d :- sqrt{sqr(a.r)+sqr{b.r)

-2*a.r*b.r*cos(a.<p-b.))

i.9. МНОЖЕСТбо

Кроме массива и записи имеется третья фундаментальная структура данных - множество. Соответствующий тип описывается следующим образом:

type Г = set of Го

(1.26)

Значениями переменной х типа Т являются множества элементов типа Го. .Множество.-всех подмножеств множества Го называется множеством-степенью Го. Таким образом, тип Г - это множество-степень своего базового типа Го.



Примеры:

type intset = set of О.. 30

type charset ~ set of char

type tapestatus ~ set of exception

Bo втором примере базовым типом является стандартное подмножество символов -тип char, в третьем примере -тип исключительных состояний магнитных лент, описанный как скалярный тип:

type exception ~ (unloaded, manual, parity, skew)

значения которого соответствуют различным состояниям устройства лентопротяжек. Если даны переменные:

is : intset CS : charset

t : an:ay[l.. 6] of tapestatus

TO формировать и присваивать значения переменных-множеств можно, скажем, так: *>

is := [1, 4, 9, 16, 25]

/[3] t[5] t[6\

- [manual] = []

= [unloaded.. skew]

Здесь значение, присваиваемое t [3],- это множество, состоящее из одного элемента manual, t[5] присваивается пустое множество, что соответствует рабочему состоянию 5 ленто-протяжки (какие-либо исключительные состояния отсутствуют), а [6] присваивается значение множества, включающего все четыре исключительных состояния. Кардинальное число множества типа Т равно

cardinality (Г) = г *W. (1.27)

Это следует из того, что каждый из элементов cardinality (То) представляется в множестве одним из двух значений: присутствует или отсутствует , и эти элементы входят в множество независимо друг от друга. Очевидно, что для эффективной и экономной реализации не только базовый тип

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




1 2 3 4 5 6 7 8 9 10 [ 11 ] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133