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

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

вещей. Все же оно достаточно близко к практическим целям, и ответственность за то, чтобы при выполнении программь; не возникали подобные бессмысленные значения, возлагается на программиста.

В следующем небольшом фрагменте программы показано использование записей. Его задача - сосчитать число лю. дей в массиве а, которые одновременно принадлежат жен, скому полу и одиноки:

таг о: аггяу[1.. iV] of Рдаол; count: integer;

count := 0; м

fori := ItoJVdo

count :- comt-\-b

Инвариант цикла здесь .

count = С (i)

где C(i)-число одиноких женщин в подмножестве аи щ.

В другом варианте записи этого оператора используется конструкция, которая называется оператором присоединения;

fori := 1 toiVdo with a[i] do

if (sex = female) Л (marstatus = single) then count := count+1

Выражение with r do s означает, что внутри оператора s селекторы переменной г можно использовать без префикса: считается, что все они ссылаются на переменную г. Таким образом, оператор присоединения позволяет сократить текст программы, а также предотвращает повторное вычисление адреса индексированной компоненты а [i].

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



First Name

Link

Carolyn

Chris

Tina

Robert

3 .

Jonathan

Jennifer

Raytheon

Mary

Anne

Mathias

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

1-8. ЗАПИСИ С ВАРИАНТАМИ

В практической работе часто кажется удобным и естественным рассматривать два типа как варианты одного и того *е типа. Например, тип Coordinate, введенный в предыдущем Разделе, можно рассматривать как объединение двух

Предположим, что индексы трех последовательных элементов списка есть ik-u ik, ik+u Значение link для /г-ro элемента берется равным ik+i~ik-\. При проходе по списку впе-д определяется двумя текущими индексными перемен-ЕьШИ X = ik-i и у = ift по формуле

ik+i==x + a[y].link

а при проходе по списку в обратном направлении ik-i определяется с помощью X = ik+i н у - ik по формуле

ik-i = X - а [y].link

Пример объединения при помощи link всех лиц одного пола показан в табл. 1.2.

Таблица 1.2. Массив элементов типа Person



вариантов: декартовых и полярных координат, компонентами которых являются соответственно (а) две длины и (Ь) длина и угол. Для того чтобы определить, какой вариант принят в данный момент, вводится третья компонента. Она назьь вается дискриминантом типа или полем признака.

iyft Coordinate -

record case kind: (Cartesian, polar) of Cartesian: (x,y: real), polar: (r: real; (p: real)

Здесь имя поля признака - kind, а имена координат - либо .у и у в случае-зндчения Cartesian (,п,е,картовы), либо г и (р в случае значения polar (полярные).

Множество значений типа Coordinate есть объединение двух типов:

Ti == (х, у: real) T2=(r:real; (р:геа1)

а его кардинальное число равно сумме кардинальных чисел Тх и 72.

Однако чаще всего приходится объединять не два полностью различных типа, а два типа с частично совпадающимв компонентами. Для такой ситуации применяется термин запись с вариантами . Примером может служить тип Person определенный в предыдущем разделе, если существенные характеристики должны записываться в файл в зависимостк от пола. Например, для мужчины могут считаться в какой-то определенной ситуации существенными такие признаки, каЕ вес и наличие бороды, а для женщины можно считать важ ными три ее основных размера (тогда как вес она может хранить в тайне). Исходя из этих допущений, получим еле дующее описание типа:

type Person =

tecotuname,firstname: alfa; birthdate: Date;

marstatus: (single, married, widowed, divorced); casjdsex: (male, female) oi male: (weight: real;

bearded: Boolean); female: (size: aiisy[l. .3]oi integer) end




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