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

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Лафоре Р. -> "Объектно-ориентированное программирование в С++" -> 239

Объектно-ориентированное программирование в С++ - Лафоре Р.

Лафоре Р. Объектно-ориентированное программирование в С++ — М.: Питер, 2004. — 992 c.
Скачать (прямая ссылка): obektnoorentprogramm2004.djvu
Предыдущая << 1 .. 233 234 235 236 237 238 < 239 > 240 241 242 243 244 245 .. 341 >> Следующая


1-FCJ-1 && current_d1r--ST0P)

current_dir - (dist_floor < current_floor) ? DN : UP; dest1nation[dest_floor] - true;//3anncaTb выбор

dests_display(); //вывести этажи назначения

}

} //конец get_dest1nations О Моделирование высотного лифта 633

Прикладная программа

Следующие два файла, ELEV_APP.H и ELEV_APP.CPP, созданы некими проектировщиками лифтовой системы конкретного здания. Соответственно, им нужно адаптировать ПО для своих целей. Для этого в файле ELEV_APP.H введены две константы — число этажей и число лифтов.

Листинг 13.6. Заголовочный файл ELEV_APP.H

// elev_app.h

// Устанавливает характеристики конкретного здания

const int NUM_FL00RS = 20: //число этажей const int NUM_CARS = 4: //число кабинок лифтов

В файле ELEV_APP.CPP инициализируются данные класса building и создается набор объектов типа elevator с помощью new (впрочем, можно было использовать и массив). Затем в цикле вызываются методы master_tick() и get_floor_request(). Функция wait() (объявленная в MS0FTC0N.H или B0RLAC0N.H) замедляет процесс для удобства восприятия человеком. Когда пользователь отвечает на запрос программы, таймер (время в программе, в противоположность пользовательскому времени) останавливается.

Листинг 13.7. Программа ELEV_APP

// elev_app.cpp // клиентский файл

finclude "elev.h" //для объявлений классов

int mainO {

building theBuilding:

while(true) {

theBuilding.master_tick(); //послать временные метки .

//всем лифтам wait(lOOO): //пауза

//получить запросы этажей от пользователей

theBuilding.record_f1oor_reqs(): }

return 0: }

Стратегия работы лифтов

Встраивание интеллекта необходимого уровня в лифтовые системы — не такая простая задача, как кажется на первый взгляд. Процесс принятия решения отрабатывается функцией decide(), состоящей из определенного набора правил. Эти правила организованы в порядке их приоритета. Если применяется одно из них, то выполняется некое действие, при этом правила более низких уровней не отрабатываются. Приведем упрощенный вариант такой обработки:

1. Если лифт вот-вот врежется в дно шахты или пробьет ее крышу, наверное, следует остановиться. 634_Глава 13. Многофайловые программы

2. Если данный этаж — это этаж назначения, высадить пассажиров.

3. Если обнаружен на данном этаже запрос «вверх», едем вверх, загружаем пассажиров.

4. Если обнаружен на данном этаже запрос «вниз», едем вниз, загружаем пассажиров.

5. Если нет запросов этажей или этажей назначения ни снизу, ни сверху, остановиться.

6. Если этажи назначения сверху, едем вверх.

7. Если этажи назначения снизу, едем вниз.

8. Если стоим или движемся вверх, есть запрос с более высокого этажа, и нет при этом лифтов, движущихся вверх, между нами и этажом запроса или над ним, а также движущихся вниз и находящихся ближе к нему, чем мы, то едем вверх.

9. Если стоим или движемся вниз, есть запрос с более низкого этажа, и нет при этом лифтов, движущихся вниз, между нами и этажом запроса или под ним, а также движущихся вверх и находящихся ближе к нему, чем мы, то едем вниз.

10. Если ничего никому от нас не нужно, останавливаемся.

Правила 8 и 9 довольно сложны. Они предназначены для исключения выполнения одного и того же запроса несколькими лифтами сразу. Тем не менее результаты не всегда идеальны. В некоторых ситуациях лифты медлят с принятием решения, очень опасаясь сделать то, что могут сделать за них другие. Но в реальности в этот момент другие лифты не движутся к той же цели, а, например, отвечают на свои запросы. Чтобы улучшить стратегию работы системы, необходимо заставить различать функцию decide() запросы «вверх» и «вниз» во время проверки относительного местонахождения ЗЭ (запроса с этажа). Но это еще больше усложнило бы и без того слишком длинную функцию, поэтому оставляем возможность дальнейших усовершенствований читателю.

Диаграмма состояний для программы ELEV

В главе 10 «Указатели» мы представляли диаграмму состояний UML. Давайте теперь взглянем на диаграмму состояний для нашей программы моделирования лифтов. Для того чтобы немного упростить задачу, будем считать, что в здании находится только один человек и имеется только один лифт. Таким образом, в один момент времени может быть только один запрос этажа и один этаж назначения. Лифту не нужно следить за другими. Диаграмма состояний представлена на рис. 13.6.

Обозначения в диаграмме таковы: «cd» — этаж назначения, то есть кнопка, нажатая внутри лифта (грубо говоря, это соответствует массиву destination из нашей программы); «fr» — запрос с этажа, кнопка, нажатая снаружи лифта, грубо говоря, значение переменной floor_req. Резюме 635

Состояния лифта определяются по значениям переменной current_dir и состояниям loading_timer и unloading_timer. Поскольку все состояния переходят друг в друга с помощью слова «вдруг» (то есть по сигналам таймера), на диаграмме показаны только контрольные состояния. Отображаются представления лифта о запросах с этажей и этажей назначения.

Резюме

Поставляемые производителем программного обеспечения библиотеки классов чаще всего состоят из двух частей: общедоступного компонента (интерфейса), содержащего объявления классов в заголовочном файле, и скрытого компонента (реализации), содержащего определения методов в объектном (.OBJ) или библиотечном (.LIB) файле.
Предыдущая << 1 .. 233 234 235 236 237 238 < 239 > 240 241 242 243 244 245 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100