- •4.9.1. Изменяемость
- •4.9.2. Классы операций
- •98 Глава 4
- •4.9.3. Полнота
- •100 Глава 4
- •4.9.5. Операции egual, similar и copy
- •102 Глава 4
- •104 Глава 4
- •5. Исключительные ситуации
- •108 Глава 5
- •110 Глава 5
- •6.2.1. Сигнализация об исключительных ситуациях
- •5.2.2. Обработка исключительных ситуаций
- •112 Глава 5
- •5.2.3. Предложение resignal
- •6.2.4. Необрабатываемые исключительные ситуации
- •114 Глава 5
- •6.2.3. Предложение resignal
- •5.2.4. Необрабатываемые исключительные ситуации
- •116 Глава 5
- •118 Глава 5
- •118 Глава 5
- •120 Глава 5
- •122 Глава 5
- •124 Глава 5
- •128 Глава 6
- •130 Глава 6
- •6.2.1. Реализация итераторов
- •6.2.2. Использование итераторов
- •132 Глава 6
- •134 Глава 6
- •136 Глава 6
- •138 Глава 6
- •140 Глава 7
- •142 Глава 7
- •7.2. Абстракция данных
- •144 Глава 7
- •146 Глава 7
- •148 Глава 7
- •150 Глава 7
- •7.4. Генераторы
- •162 Глава 7
- •154 Глава 7
- •156 Глава 7
- •162 Глава 8
- •164 Глава 8
- •166 Глава 8
- •168 Глава 8
- •170 Глава 9
- •172 Глава 9
- •174 Глава 9
- •176 Глава 9
- •9.1.3. Пример
- •178 Глава 9
- •180 Глава 9
- •182 Глава 9
- •184 Глава 9
- •186 Глава 9
- •188 Глава 9
- •190 Глава 9
- •192 Глава. 9
- •194 Глава 9
162 Глава 7
qelems = generator type is qelems_create, qelems_done,
qelerns-next, qelems_destroy
Описание
Генераторы qelems используются для выполнения итераций по элементам очередей целых чисел intqueue. Реализация может зависеть от представления очереди целых чисел intqueue.
Операции
function qelems_create (qJntqueue): qelems
effects Возвращается некоторый объект qelems, который может быть использован для выдачи всех элементов в очереди q. function qelems_done (qi: qelems): boolean
requires Чтобы очередь целых чисел intqueue, используемая для создания элементов qi, не модифицировалась после того, как создан элемент qi.
effects Возвращается значение true, если все элементы в очереди целых чисел intqueue, используемой для создания элементов qi, были «выданы» после того, как был создан элемент qi. В противном случае возвращается значение false. function qelems.next (qi: qelems): integer
requires Чтобы очередь целых чисел intqueue, используемая для создания элементов qi, не модифицировалась после того, как создан элемент qi, и чтобы существовал некоторый элемент в очереди целых чисел intqueue, который еще не был выдан. modifies oi
effects Еозгращается некоторый элемент в очереди чисел intqueiie, используемый для создания элемента qi. Этот элемент не был выдан после того, как был создан элемент qi. Элемент qi модифицируется для того, чтобы отметить тот факт, что данный элемент был «выдан». proctewe qelems_destroy (qi: qelems) modifies qi
effects Освобождается вся память из неупорядоченного массива, занимаемая элементом qi. end qelems
Рис. 7,i0. Спецификация типа данных генератор для очередей.
Используя тип данных qelems, мы можем заново реализовать суммирование следующим образом:
sum := О
qi := qelems_create (q); tt-hi'le not (qelems. done (qi)) do
sum := sum + qelems. next (qi); qelems- destroy (qi)
Другие циклы реализуются аналогичным образом. На рис. 7. II приводится реализация операций над типом данных qelems. Эта реализация совместима с реализацией очереди целых чисел intqueue, приведенной на рис. 7.2. На самом деле осуществляется доступ к представлению очереди целых чисел intqueue. Такой доступ типичен для генераторов, использующих такие совокупносчи, как очереди целых чисел intqueue. Они в действительности являются частью данного типа совокупности, как итераторы являются частью языка CLU. Отметим, что пред-
Использование языка Паскаль
qelems = {qelemsJ-ep; qelems_rep == ^intqueue_elem; function qelems_create (q: intqlieue): qelems; var qi: qelems; begin new (qi); qit := qf; qelems .create :== qi end {функция qelems_create}; lunction qelems .done (qi: qelems): boolean; begin
qelems_done := (qi^ == nil) end {функция qelems_done}; function qelems_next (qi: qelems): integer; begin if q^ = nil then failure ("К функции qelems_next обратились с пустой очередью
генератора") else begin qelems_next := qi-("l-.val; ФТ ••= qiTt-next end
end {функция qelems_next}; procedure qelems_destroy (qi: qelems); begin
dispose (qi); end {процедура qelems_destroy};
Рис. 7.11. Реализация генератора для типа данных очередь целых чисел intqueue.
ставление имеет дополнительный уровень косвенности дла того, чтобы гарантировать, что совместимое использование работает правильно.
7.5. Полный пример
В этом разделе приводится конкретная иллюстрация того, как подготовить программу на языке Паскаль, используя подход, который мы описали. Предположим, что у нас есть некоторая библиотека абстракций, в которую включен тип данных intbintree, приведенный на рис. 7.12, а мы хотим реализовать некоторую функцию, которая организует поиск по бинарному дереву целых чисел методом в ширину.
Поиск в ширину обычно реализуется с использованием очереди деревьев. Сначала помещаем в пустую очередь то дерево, по которому будет выполняться поиск. Затем проверяем, содержит ли корневой узел этого дерева тот элемент, который мы ищем. Если он не содержит его, удаляем из очереди это дерево и помещаем в очередь его правое и левое поддеревья. Затем этот процесс повторяется для каждого из этих деревьев. Если в конце
