Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 162

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 156 157 158 159 160 161 < 162 > 163 164 165 166 167 168 .. 316 >> Следующая

Сделаем еще три замечания, характеризующих некоторые тонкости модульного программирования.
Во всех модульных расширениях языка Pascal возникает обая проблема конфликта имен. Если один и тот же идентификатор описан в нескольких модулях, используемх программой, то транслятор дол ен разреать конфликт имен. Конечно же, есть соглашение по умолчанию, какое по порядку описание считается главнм, но им мы реительно не рекомендуем пользоваться. бое имя, встретивееся в модуле, мо ет быть однозначно специфицировано как
ThisUnit.Identifier
Этим луче всего пользоваться, а для сокраения записи мо но применить конструкци
with ThisUnit do begin ... end;
В программе или модуле видимы лишь те имена, которые определены в модулях, перечисленнх в соответствуем предло ении uses. икакого транзитивного замкания простанства имен не производится.
458
ГЛАВА 8. ПОДПРОГРАММЫ
Если два модуля разрабатыва тся совместно, то кадый из них мо ет имет в своем операторе uses ссылку на другой. Это не считается ошибкой, лишь если открытая структура зависимостей модулей остается сетью (графом без циклов). оэтому целесообразно обе перекрестне ссылки упрятать в раздел implementation.
Если обратиться к задаче спецификации предоставляемх модулем средств, то придется констатировать, что возможности TURBO Pascal^ версии 5.0 в этом отношении очень ограничены. Нет никакой поддержки независимого от реализации описания и, как следствие, документация оказвается отделена от программы. Впрочем, этим е недостатком страда т и все последуие языки линии TURBO Pascal и Object Pascal. Единственное, что они могут предложить — это рецепт использовать мнемоничные имена. А этого явно недостаточно. Из нашего примера видно, что если б мы реализовывали не очередь, а стек, то интерфейсная часть модуля отличалась б только именами. Чтобы можно было бы увидеть, что именно реализовано в модуле, программист дол ен позаботиться о соответствуем описании дополнительно. Здесь и ему, и пользователю его модуля придется обратиться к призракам-переменным, призракам-процедурам или к иным призракам составляемой программы.
8.6.3. Пример использования модуля
В качестве иллюстрации использования построенного абстрактного типа данных приводится задача, требующая реализации линии задержки — специального приема программирования, основанного на накоплении порций информации из потока для последуей их совместной обработки.
Требуется смоделировать поведение кота-рыболова, который знает, сколько грамм рыбы MaxW он может съесть за один день, при этом не позволяя себе оставлять частично съеденну рбину.
усть у кота есть последовательность садков для хранения рыб . Стратегия кота состоит в следуем. Если очередная поступивая рыба мо ет быть съедена в тот е день (суммарнй вес у е накопленных в текуем садке и очередной не превосходит MaxW), то она помещается в текущий садок, и тем самым величина веса рыб текущего садка CurW увеличивается. При этом, если суммарнй вес рыбы становится равнм MaxW, то садок считается заполненным и далее рыбы размещаются в следующем садке. Когда сум-марнй вес рыб превыает норму, возмо но, что в садке есть рба, замена которой на очередную позволит уложиться в норматив MaxW. В этом случае
8.6.МОДУЛЬНОСТЬ TURBO PASCAL
459
принимается реение об обмене рб. Если е это невозмо но, то садок считается загруженным (лучше недоесть, чем что-то оставить). В обоих случаях одна из рыб — текущая или обмененная — помещается в следующий садок.
ля простоты считается, что обмен на две или более у е пойманнх рб превосходит интеллектуальные силы кота. о исчерпании поступления рб последний из садков может оказаться неполным. Требуется напечатать последовательность весов рыб, размещаемых в садках, и суммарные веса рыб в каждом садке.
Задача решается путем 'перекачки' поступающей рыбы в очередь с одновременным накоплением суммарного веса. ак только последний превает норму, организуется очистка очереди, в ходе которой иутся рыб , способные заменить последний экземпляр из поступивших с улучшением показателя насыщения. Найденные таким образом экземпляры обмениваются на последний поступивий и начина т играть роль последнего поступивего.
ри этом возмо но выполнение серии обменов. В программе использу т-ся вспомогательные процедуры: InpW, организующая ввод входного потока с текущим контролем, ClearQueue, очищающая очередь и распечатывающая ее содержимое, и InpHandle, выполняющая все действия, связанные с обработкой очередного входного числа.
Решение опирается на использование модуля IntQueue, т. е. демонстрируются возможности модульной декомпозиции на базе языка Turbo Pascal 5.5, а не более развитых версий. Это сделано по следующим причинам:
• Достаточность средств модуля для данной задачи, для которой нет необходимости использовать несколько очередей, очереди с нецелочисленными или разного типа элементами. Как следствие, прибегать, к примеру, к объектно-ориентированным средствам особой нужды нет.
• остаточность средств модуля для демонстрации возмо ностей средств модуляризации всех языков линии Turbo Pascal. Как можно было увидеть из предыдущего обсуждения, эти средства у более развитых языков базируются на том же, что предлагалось в Turbo Pascal 5.5. Дополнительные средства принципиально картину не меня т.
Предыдущая << 1 .. 156 157 158 159 160 161 < 162 > 163 164 165 166 167 168 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100