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

 

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

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

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


requests_above - true; //установить флаг if( !nearest_higher_req ) //если еще не установлен nearest_higher req - j: //установить ближайший ЗЭ

}

}

for(j-current_floor-l; j>-0: j--) //проверка нижних этажей (

if(destination[j] ) //если назначения

destins_below - true; //установить флаг if( ptrBuilding->get_floor_req(UP. j) ||

ptrBuilding->get_floor_req(DN. j) ) , { //если запросы

' requests_below - true; //установить флаг » if( !nearest_lower_req ) //если еще не установлен nearest_lower_req - j; //установить ближайший ЗЭ

}

}

//если нет запросов сверху/снизу, остановиться if( !destins_above && !requests_above &&

!destins below && !requests_below) {

current_dir = STOP;

return; }

//если есть назначение, а мы стоим или движемся к нему, //начать/продолжать движение

if( destins_above && (current_dir=-STOP || Current_dir—UP) ) {

current_dir = UP;

return; V-'

}

if( destins_below && (current_dir==STOP || current_dir--DN) ) {

current_dir - DN:

return; }

//проверка, есть ли другие лифты, (а) того же направления //между нами и ближайшим ЗЭ, или //(b) встречного направления с другой стороны ЗЭ car_between_up - car_between_dn - false; car~opposite_up - car_opposite_dn - false;

for(j-0: j<NUM_CARS; j++) //проверить каждый лифт Моделирование высотного лифта_631

if(j !- car_number) //если зто не наш лифт

{ //получить его зтаж

of!оог = ptrBuilding->get_cars_floor(j): //и odir - ptrBuilding->get_cars_dir(j); //направление

//если едет вверх, и ЗЭ вверху if( (odir—UP И odir^—STOP) && requests_above ) //если он при этом между нами и ЗЭ if( (ofloor > current_floor

&& ofloor <- nearest_higher_req) //или там же. но его номер ниже Il (ofloor—current_fIoor && j < car_number) ) car_between_up - true; //если он едет вниз, и ЗЭ внизу і f( Codi і—DN И odii—STOP) && requests_below ) //если он снизу, но над ближайшим ЗЭ if( (ofloor < current_floor

&& ofloor >- nearest_lower_req) //или на том же зтаже. но с меньшим номером Il (ofloor—current_floor && j < car_number)) car_between_dn - true; //если идет вверх, а ЗЭ снизу if( (odir—UP Il odir—STOP) && requests_below ) //и он ниже ЗЭ и ближе к нему, чем мы if(nearest_lower_req >- ofloor && nearest_lower_req - ofloor

< current_floor - nearest_lower_req) car_opposite_up - true;

//если идет вниз, а ЗЭ сверху if( (odir—DN И odir—STOP) && requests_above ) //и он над ЗЭ и ближе к нему, чем мы іfCof1оог >- nearest_higher_req && ofloor - nearest_higher_req

< nearest_higher_req - current_floor) car_opposite_dn - true:

} //конец іf(не для нашего лифта) } //конец for(для каждого лифта)

//если идем вверх или остановились, а ЗЭ над нами //и между нами и ЗЭ нет идущих вверх-лифтов //или идущих вниз над ЗЭ и ближе к нему, чем мы. тогда //ехать вверх

іfС (current_dir—UP И current_dir—STOP)

&& requests_above && !car_between_up && !car_opposite_dn )

{

current_dir = UP;

return; }

//если идем вниз или остановились, и снизу есть ЗЭ. //и нет лифтов, идущих вниз, между нами и ЗЭ //или под ЗЭ. идущих вверх и ближе нас к ЗЭ if( (current_dir—DN И current_d1r—STOP)

&& requests below && !car between dn && !car_opposite_up )

{

current_dir - DN; return;

продолжение і? 632

Глава 13. Многофайловые программы

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

}

//если больше ничего не происходит, остановиться current_dir = STOP: } //end decideO, finally

//......................................... ..............

void elevator::move() { //если посадка или высадка,

if(loading_timer [[ unloading_timer) //не двигаться return:

if(current_dii—UP) //если идем вверх, идти вверх

current_floor++; else if(current_dir==DN) //если идем вниз, идти вниз

current_floor--; } //end moveО

//...... ...............................................

void elevator::get_destinations О //остановка, получение

//пунктов назначения

{

char ustring[BUF_LENGTH]; //входной рабочий буфер int dest_floor; //этаж назначения

set_cursor_pos(l.22):с1еаг_1іпе()://увалить верхнюю строку

set_cursor_pos(l, 22):

cout « "Лифт " « (car_number+l)

« " остановился на этаже " « (current_floor+l) « "\пЭтаж назначения (0 для окончания ввода)": for(int j=l: j<NUM_FL00RS: j++) //получить запросы этажей { //максимум; обычно меньше

set_cursor_pos(l. 24); cout « "Этаж назначения " « j « "; ":

cin.get(ustring, BUF_LENGTH): //(во избежание дублирования

//пустых строк) cin.ignoredO. '\п'); //съесть символы, включая

//ограничитель

dest_floor - atoi(ustring):

set_cursor_pos(1.24): clearJineO; //стереть старую

//строку

і f(dest_fIoor==O) //если больше нет запросов

{ //стереть нижние три строки

set_cursor_pos(1.22); clearJ і net); set_cursor_pos(l,23): clearJineO: set_cursor_pos (1,24): cl ear J і neO;

return: }

--dest_floor: //начинать с 0. а не 1

if(dest_floor~current_floor) //выбрать текущий этаж

{ --J? continue: } ~ // забыть его

//если мы остановились, первый запрос выбирает

//направление движения
Предыдущая << 1 .. 232 233 234 235 236 237 < 238 > 239 240 241 242 243 244 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100