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

 

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

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

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


Процесс посадки пассажиров включает в себя последовательность определенных шагов, которые на экране отображаются так:

1. кабинка с закрытыми дверями, счастливое лицо отсутствует;

2. кабинка с открытыми дверями, счастливое лицо слева;

3. кабинка со счастливым лицом в открытых дверях, узнать от пассажира конечный этаж;

4. кабинка с закрытыми дверями, счастливое лицо отсутствует.

При высадке пассажира применяется обратный порядок. Эти последовательности действий осуществляются с помощью таймера (целочисленной переменной), который уменьшается с каждой временной отметкой (tick) от 3 до 0. С помощью case в функции car_display() выбирается и рисуется на экране соответствующая версия изображения лифта.

Поскольку программа ELEV использует функции консольной графики, должен быть доступ к заголовочным файлам библиотек MS0FTC0N.H для компилято- Моделирование высотного лифта 623

ров Microsoft или B0RLAC0N.H для компиляторов Borland (см. приложение Д «Упрощенный вариант консольной графики»).

Листинг программы ELEV

Мы разделили программу на четыре файла. Два из них, ELEV.H и ELEV.CPP, могут поставляться, например, производителем программного обеспечения лифтов. Затем это ПО может купить строительная компания, заинтересованная в проектировании лифтовой системы здания. (Приводимая здесь программа не имеет надлежащего сертификата, поэтому лучше не пытаться использовать ее для работы с реальными лифтами.) Затем инженеры могут написать другую пару файлов, ELEV_APP.H и ELEV_APP.CPP, в первом из которых описаны характеристики высотного здания. Действительно нужно использовать разные файлы, потому что эти характеристики должны быть доступны методам класса лифтов, и простейшим решением для этого является именно включение ELEV_APP.H в ELEV.H. В файле ELEV_APP.CPP инициализируются лифты, затем в определенные моменты времени вызываются функции работы лифтов, что создает более точную картину в реальном времени.

Описатель класса

В файле ELEV.H содержится описатель класса elevator. Массив указателей на лифты, car_list[], позволяет каждой кабинке опрашивать все другие, выясняя их местонахождение и направление движения.

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

// elev.h

// заголовочный файл для лифтов - содержит обьявления //классов

finclude "elev_app.h" //поставляется клиентом

//(застройщиком)

finclude "msoftcon.h" //для консольной графики finclude <iostream>

finclude <iomaniр> //для setwО

finclude <conio.h> //для вывода на экран

finclude <stdlib.h> //для ItoaO

finclude «process.h> //для exit О using namespace std:

enum direction { UP, DN, STOP }:

const int LOAD_TIME - 3: //время посадки/высадки

//(B tick'ax) const int SPACING = 7; //расстояние между

//изображениями кабинок const int BUF_LENGTH = 80; //длина буфера рабочей строки

class building; //будущее объявление ///////////////////////////////////////////////////////////

class elevator {

private:

building* ptrBuilding: //указатель на building

продолжение і? 624 Глава 13. Многофайловые программы

Листинг 13.4 (продолжение)

const int car_number: //номер лифта (от 0 до пс-1) 1nt current_fToor; //где мы? (от 0 до nf-1) 1nt old_floor; //куда едем? (от 0 до nf-1)

direction current_d1r: //в каком направлении?

bool destination[№JM_FLOORS]: //выбирается пассажирами int loading_timer: //ненулевое во время посадки int unloading_timer: //ненулевое во время высадки

public:

elevator(building*. int): //конструктор void car_tickl(); //метроном-1 для каждой кабинки

void carj:ick2(): //метроном-2 для каждой кабинки

void carjJisplayO; //рисование лифта

void dests_display() const://вывод запросов void decideO: //принятие решения

voidmoveO: //движение лифта

void get_destinations(): //получение номеров конечных //этажей

int get_floor() const; //получение текущего этажа

direction get_direction() const: //получение текущего //направления }:

///////////////////////////////////////////////////////////

class building {

private:

elevator* car_list[NUM_CARS]; //указатель на кабинки int num_cars: //уже созданные лифты

//массив кнопок «вверх», «вниз» bool floor_request[2][NUM_FL00RS];//false=8Bepx. true=BHH3

public:

buildingO: //конструктор

-buildingO: //деструктор

void master_tick(); //рассылка временных меток всем //лифтам

int get_cars_floor(const int) const: //поиск лифта

//выяснение направления движения direction get_cars_dir(const int) const:

//проверка запроса с зтажа bool get_floor_req(const int. const int) const:

//установка запроса с зтажа void set_floor_req(const int. const int. const bool); void record_floor_reqs(): //получение запроса с этажа void show_floor_reqs() const; //вывод запроса }:

/////////////////////////////////////////////////////////// Методы

В файле ELEV.CPP содержатся определения класса elevator и методы и данные класса building. Функции building инициализируют систему, устанавливают метроном, получают и выводят запросы. Функции elevator инициализируют с помощью конструктора отдельные лифты, устанавливают два метронома для каждой кабинки, выводят изображение лифтов, их направления, принимают решения, двигают лифты и получают номера конечных этажей от пользователя. Моделирование высотного лифта 625
Предыдущая << 1 .. 229 230 231 232 233 234 < 235 > 236 237 238 239 240 241 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100