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

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. Реализация генератора для типа данных очередь целых чисел int­queue.

ставление имеет дополнительный уровень косвенности дла того, чтобы гарантировать, что совместимое использование работает правильно.

7.5. Полный пример

В этом разделе приводится конкретная иллюстрация того, как подготовить программу на языке Паскаль, используя под­ход, который мы описали. Предположим, что у нас есть некото­рая библиотека абстракций, в которую включен тип данных intbintree, приведенный на рис. 7.12, а мы хотим реализовать некоторую функцию, которая организует поиск по бинарному дереву целых чисел методом в ширину.

Поиск в ширину обычно реализуется с использованием оче­реди деревьев. Сначала помещаем в пустую очередь то дерево, по которому будет выполняться поиск. Затем проверяем, содер­жит ли корневой узел этого дерева тот элемент, который мы ищем. Если он не содержит его, удаляем из очереди это дерево и помещаем в очередь его правое и левое поддеревья. Затем этот процесс повторяется для каждого из этих деревьев. Если в конце

Соседние файлы в папке POSIBNIK