Класс "Грузовой лифт"

Министерство образования Российской Федерации

Тульский государственный университет

Кафедра автоматики и телемеханики















Класс «Грузовой лифт»

Пояснительная записка

к контрольно-курсовой работе

по курсу «Объектно-ориентированное программирование»

















Выполнила: студентка группы 220622

Павликова М. В.  

Проверил: доцент кафедры АТМ 

Середин О. С.





Тула 2004





Аннотация



В контрольно-курсовой работе рассмотрена задача создания класса «грузовой лифт» и описания операций над данным классом. Эта задача была спроектирована с использованием концепций объектно-ориентированного программирования и реализована на языке программирования С++. Пояснительная записка содержит 26 листов, 5 рисунков и 3 использованных источника.



Содержание



Стр. 

Введение	3

Постановка задачи	5

Построение абстрактной модели класса «грузовой лифт»	6

2.1 Построение диаграммы классов	9

2.2 Построение диаграммы модулей	10

Структура класса «грузовой лифт»	11

3.1Формальное описание класса	11

3.2 Описание структур данных	13

3.3 Инструкция программисту	21

Демонстрационная программа	22

4.1Текст программы	22

4.2 Инструкция пользователю	22

Тестовый пример	23

Заключение	25

Список использованных источников	26



Введение



Объектно-ориентированное программирование – это новый подход к созданию программ. По мере развития вычислительной техники возникали разные методики программирования. На каждом этапе создавался новый подход, который помогал программистам справляться с растущим усложнением программ. Первые программы создавались посредством ключевых переключателей на передней панели компьютера. Очевидно, что такой способ подходит только для очень небольших программ. Затем был изобретён язык ассемблера, который позволял писать более длинные программы. Следующий шаг был сделан в 1950 году, когда был создан первый язык высокого уровня Фортран.

Используя язык высокого уровня, программисты могли писать программы до нескольких тысяч строк длиной. Для того времени указанный подход к программированию был наиболее перспективным. Однако язык программирования, легко понимаемый в коротких программах, когда дело касалось больших программ, становился нечитабельным (и неуправляемым). Избавление от таких неструктурированных программ пришло после изобретения в 1960 году языков структурного программирования. К ним относятся языки Алгол, Паскаль, и С. Структурное программирование подразумевает точно обозначенные управляющие структуры, программные блоки, отсутствие (или, по крайней мере, минимальное использование) инструкций GOTO, автономные подпрограммы, в которых поддерживается рекурсия и локальные переменные. Сутью структурного программирования является возможность разбиения программы на составляющие элементы. Используя структурное программирование, программист может создавать и поддерживать программы свыше 50000 строк длинной.

Хотя структурное программирование, при его использовании для написания умеренно сложных программ, принесло выдающиеся результаты, даже оно оказывалось несостоятельным тогда, когда программа достигала определённой длины. Чтобы написать более сложную программу, необходим был новый подход к программированию. В итоге были разработаны принципы объектно–ориентированного программирования. ООП аккумулирует лучшие идеи, воплощённые в структурном программировании, и сочетает их с мощными новыми концепциями, которые позволяют оптимально организовывать ваши программы. Объектно-ориентированное программирование позволяет вам разложить проблему на составные части. Каждая составляющая становится самостоятельным объектом, содержащим  свои собственные коды и данные, которые относятся к этому объекту. В этом случае вся процедура в целом упрощается, и программист получает возможность оперировать с гораздо большими по объёму программами.

Все языки ООП основаны на трёх основополагающих концепциях, называемых инкапсуляцией, полиморфизмом и наследованием:

Инкапсуляция – это механизм, который объединяет данные и код, манипулирующий с этими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования.

Полиморфизм – это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий.

Наследование – это процесс, посредством которого один объект может приобретать свойства другого. Точнее, объект может наследовать основные свойства другого объекта и добавлять к ним черты, характерные только для него.

В контрольно-курсовой работе реализуем класс «грузовой лифт». Лифты можно подразделять по множеству признаков, например: грузовые и легковые, пассажирские и непассажирские и т. д. В данном случае будет написан класс для демонстрации работы лифта для перевозки груза в сопровождении человека. В качестве параметров работы лифта будут использованы: грузоподъёмность, политика обслуживания запросов (останавливаться ли на промежуточных этажах), количество этажей в здании и активация безопасного режима работы. Данный класс может быть использован в аппаратуре управления лифтом, т. к. может быть настроен на конкретные условия работы. В качестве демонстрационной программы покажем порядок выполнения запросов при разных настройках лифта и разных входных данных.



Постановка задачи



Требуется создать класс «лифт», в котором будет реализована базовая функциональность лифта, затем создать производный от него класс «грузовой лифт». Класс должен быть настраиваемым на конкретные условия работы. Параметрами такой настройки могут быть: количество этажей в здании, политика обслуживания запросов, грузоподъёмность лифта и т. д. Должны быть продуманы вопросы безопасности и оптимизации работы лифта.



Построение абстрактной модели

класса «грузовой лифт»



В начале работы создан базовый класс «лифт», реализующий основную функциональность лифта. 

Параллельно с базовым классом создан класс «груз» со следующими членами класса:

		этаж, на котором находится груз;

		этаж, на котором ему нужно оказаться;

		вес груза.

На базе классов «лифт» и «груз» создадим класс «грузовой лифт». Этот класс будем наследовать от класса «лифт», а одним из членов этого класса будет массив из элементов класса «груз».

Приведём описание класса «лифт»:

class lift

{

float weight;//грузоподъемность

int height;//кол-во этажей

bool stop;//остановка на промежуточных этажах

float weight_load;//вес груза

float exc_weight;//превышение грузоподъемности

bool safety;//активация безопасности

public:

lift();

void put_weight(float weigh);

void put_h(int h);

void put_stop(bool stp);

void put_wload(float weigh);

void put_excess(float exc);

void put_safety(bool saf);

float get_weight();

int get_h();

bool get_stop();

float get_wload();

float get_excess();

bool get_safety();

void global_tuning();

};

Класс имеет следующие члены-данные:

weight – грузоподъёмность лифта;

height – высота дома, в котором эксплуатируется лифт (количество этажей);

stop – политика обслуживания запросов (останавливаться ли на промежуточных этажах);

weight_pas – вес пассажиров и груза, находящихся в лифте;

exc_weight – допустимое превышение грузоподъёмности лифта;

safety – активация безопасной работы лифта.

Также в классе определены следующие операции над членами-данными:

установка и возврат значений членов-данных;

настройка лифта перед запуском в эксплуатацию;

подъём и спуск кабины лифта;

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

Далее приведём описание класса «груз»:

class load

{

int first_floor;//начальный этаж

int last_floor;//конечный этаж

float weight_load;//вес сопровождаемого груза

float pas_weight;//вес пассажира

bool in_lift;//в лифте

bool out_lift;//вне лифта

public:

load();

void put_first(int floor);

void put_last(int floor);

void put_load(float car);

void put_in(bool in);

void put_out(bool out);

int get_first();

int get_last();

float get_load();

float get_pweight();

bool get_in();

bool get_out();

};



Класс имеет следующие члены-данные:

first_floor – этаж, на котором находится груз перед отправкой;

last_floor – этаж, на котором должен оказаться груз;

weight_load – вес груза;

pas_weight – вес пассажира, сопровождающего груз;

in_lift – нахождение груза в лифте;

out_lift – нахождение груза вне лифта.

В классе определены операции установки и возврата значений членов-данных.

На базе предыдущих двух классов получим класс «грузовой лифт». Описание класса приведено ниже:

class car_lift: public lift

{

load *cargo;//массив грузов

int qual;//количество вызовов

public:

car_lift();

~car_lift();

int get_first(int k);

int get_last(int k);

float get_load(int k);

float get_pweight(int k);

bool get_in(int k);

bool get_out(int k);

void put_load(int ql);

void turning();

void entry(load &l);

void out(load &l);

void overl(int floor);

void work();

};

В классе определены члены-данные:

сargo – массив элементов класса «груз»;

qual – количество человек вызовов лифта.

Над членами-данными класса определены следующие операции:

установка количества пассажиров, ожидающих лифт;

ввод данных для работы лифта;

изменение членов-данных класса в связи со входом пассажира в лифт;

изменение членов-данных класса в связи с выходом пассажира из лифта;

изменение членов-данных класса в связи с перегрузкой лифта;

движение лифта.



2.1 Построение диаграммы классов



Диаграмма классов показывает классы и их отношения, тем самым, представляя логический аспект проекта. Отдельная диаграмма классов представляет определенный ракурс структуры классов. На стадии анализа используются диаграммы классов, чтобы выделить общие роли и обязанности сущностей, обеспечивающих требуемое поведение системы. На стадии проектирования пользуются диаграммой классов, чтобы передать структуру классов, формирующих архитектуру системы. 

Два главных элемента диаграммы классов - это классы и их основные отношения. 

Основные атрибуты и функции данных классов, а также их взаимосвязь и иерархию удобно показать на диаграмме классов (рисунок 2.1).





Рис. 2.1 – Диаграмма классов для объекта «грузовой лифт»



2.2 Построение диаграммы модулей



Диаграмма модулей показывает распределение классов и объектов по модулям в физическом проектировании системы. Каждая отдельная диаграмма модулей представляет некоторый ракурс структуры модулей системы. При разработке мы используем диаграмму модулей, чтобы показать физическое деление нашей архитектуры по слоям и разделам. Основными элементами диаграммы модулей являются модули и их зависимости. 

Единственная связь, которая может существовать между двумя модулями, - компиляционная зависимость - представляется стрелкой, выходящей из зависимого модуля. В C++ такая зависимость указывается директивой #include. В множестве компиляционных зависимостей не могут встречаться циклы. Чтобы определить частичную упорядоченность компиляций, достаточно выполнить частичное упорядочение структуры модулей системы.

На рисунке 2.2 показана диаграмма модулей для нашей задачи.







Рис. 2.2 – Диаграмма модулей




Структура класса «грузовой лифт»



Формальное описание класса



Далее приведены заголовочные h –файлы с комментариями.

Заголовочный файл класса «груз»:

class load

{

int first_floor;//начальный этаж

int last_floor;//конечный этаж

float weight_load;//вес груза

float pas_weight;//вес пассажира

bool in_lift;//в лифте

bool out_lift;//вне лифта

public:

load();//конструктор

void put_first(int floor);//установка начального этажа

void put_last(int floor);//установка конечного этажа

void put_load(float car);//установка веса груза

void put_in(bool in);//установка нахождения груза в лифте

void put_out(bool out);//установка нахождения груза вне лифта

int get_first();//возврат начального этажа

int get_last();//возврат конечного этажа

float get_load();//возврат веса груза

float get_pweight();//возврат веса пассажира

bool get_in();//возврат нахождения груза в лифте

bool get_out();//возврат нахождения груза вне лифта

};

Заголовочный файл класса «лифт»:

class lift

{

float weight;//грузоподъемность

int height;//кол-во этажей

bool stop;//остановка на промежуточных этажах

float weight_load;//вес груза и пассажиров в лифте

float exc_weight;//превышение грузоподъемности

bool safety;//активация безопасности

public:

lift();//конструктор

void put_weight(float weigh);//установка грузоподъемности

void put_h(int h);//установка количества этажей

void put_stop(bool stp);//установка политики обслуживания 

(останавливаться ли на  промежуточных этажах)

void put_wload(float weigh);//установка веса груза и пассажиров в лифте

void put_excess(float exc);//установка превышения грузоподъемности

void put_safety(bool saf);//установка безопасности

float get_weight();//возврат грузоподъемности

int get_h();//возврат количества этажей

bool get_stop();//возврат политики обслуживания

float get_wload();//возврат веса груза и пассажиров в лифте

float get_excess();//возврат превышения грузоподъемности

bool get_safety();//возврат безопасности

void global_tuning();//настройка лифта

};

Заголовочный файл класса «грузовой лифт»:

class car_lift: public lift

{

load *cargo;//массив грузов

int qual;//количество вызовов

public:

car_lift();

~car_lift();

int get_first(int k);//возврат начального этажа

int get_last(int k);//возврат конечного этажа

float get_load(int k);//возврат веса груза

float get_pweight(int k);//возврат веса пассажира

bool get_in(int k);//возврат нахождения груза в лифте

bool get_out(int k);//возврат нахождения груза вне лифта

void put_load(int ql);//установка количества вызовов

void turning();//ввод данных для работы лифта

void entry(load &l);//вход пассажира из лифта

void out(load &l);//выход пассажира из лифта

void overl(int floor);//временный выход пассажира в связи с перегрузкой

void work();//работа лифта

};



Описание структур данных



Далее приведено описание структур данных и функций используемых классов.

void global_turning()

Функция используется для глобальной настройки работы лифта. Пример реализации функции приведён ниже:

void lift::global_tuning()

{

clrscr();

float f_number=0;

int i_number=0;

cout<<"Глобальная настройка работы лифта:"<<endl;

do

{

cout<<"Грузоподъемность лифта(кг): ";

cin>>f_number;

if(f_number<=0)

cout<<"Грузоподъемность должна быть больше 0"<<endl;

} while (f_number<=0);

put_weight(f_number);

cout<<"Активировать безопасность?('да'-1) ";

cin>>i_number;

if(i_number==1) put_safety(true);

else put_safety(false);

if(get_safety()==false)

{

do

{

cout<<"Допустимое превышение грузоподъемности(кг): ";

cin>>f_number;

if(f_number<0)

cout<<"Превышение грузоподъемности должно быть положительным"<<endl;

} while (f_number<0);

put_excess(f_number);

}

do

{

cout<<"Количество этажей в здании: ";

cin>>i_number;

if(i_number>25) cout<<"Количество этажей должно быть меньше 25"<<endl;

} while (i_number>25);

put_h(i_number);

cout<<"Останавливаться на промежуточных этажах?('да'-1) ";

cin>>i_number;

if(i_number==1) put_stop(true);

else put_stop(false);

}

В данной реализации производится проверка вводимых значений, чтобы избежать некорректных данных. Например, грузоподъёмность лифта должна быть положительной (больше 0), а количество этажей в здании, в котором эксплуатируется лифт, меньше 25 (это связано демонстрационной программой).

int up(int a, int b)

Функция используется для подъёма кабины лифта с этажа a на этаж b. Пример реализации функции приведён ниже:

int up(int a, int b)

{

char num[10];

delay(4000);

setcolor(0);

outtextxy(25,47,"Двери открыты!");

int x=5+(a-1)*25;

for(int i=a;i<=b;i++)

{

setcolor(15);

itoa(i,num,10);

outtextxy(x+6,15,num);

if(i>a)

{

setcolor(8);

itoa(i-1,num,10);

outtextxy(x-19,15,num);

}

x+=25;

delay(2000);

}

setcolor(15);

rectangle(5,40,150,60);

setcolor(15);

outtextxy(25,47,"Двери открыты!");

return b;

}

В данной реализации функция лишь подсвечивает номера этажей во время движения. А после прибытия лифта подсвечивает надпись «Двери открыты!».

int down(int a, int b)

Функция используется для спуска кабины лифта с этажа a на этаж b. Пример реализации функции приведён ниже:

int down(int a, int b)

{

char num[10];

delay(4000);

setcolor(0);

outtextxy(25,47,"Двери открыты!");

int x=5+(a-1)*25;

for(int i=a;i>=b;i--)

{

setcolor(15);

itoa(i,num,10);

outtextxy(x+6,15,num);

if(i<a)

{

setcolor(8);

itoa(i+1,num,10);

outtextxy(x+31,15,num);

}

x-=25;

delay(2000);

}

setcolor(15);

rectangle(5,40,150,60);

setcolor(15);

outtextxy(25,47,"Двери открыты!");

return b;

}

Функция идентична функции подъёма лифта.

void turning()

Функция используется для ввода данных необходимых для работы лифта. Пример реализации функции приведён ниже:

void car_lift::turning()

{

float f_number=0;

int i_number=0;

cout<<"Ввод необходимых данных!"<<endl;

cout<<"Введите количество человек, ожидающих лифт: ";

cin>>i_number;

put_load(i_number);

for(int i=0; i<qual; i++)

{

cout<<i+1<<"-ый вызов:"<<endl;

do

{

cout<<"Начальный этаж: ";

cin>>i_number;

if((i_number<=0)||(i_number>get_h()))

cout<<"В этом доме нет такого этажа!"<<endl;

} while((i_number<=0)||(i_number>get_h()));

cargo[i].put_first(i_number);

do

{

cout<<"Конечный этаж: ";

cin>>i_number;

if((i_number<=0)||(i_number>get_h()))

cout<<"В этом доме нет такого этажа!"<<endl;

if(i_number==cargo[i].get_first())

cout<<"Этому грузу не надо никуда ехать!"<<endl;

} while((i_number<=0)||(i_number>get_h())||(i_number==cargo[i].get_first()));

cargo[i].put_last(i_number);

do

{

cout<<"Вес груза(кг): ";

cin>>f_number;

if(f_number<0)

cout<<"Вес должен быть положительным!"<<endl;

if(f_number>get_weight()-cargo[i].get_pweight())

cout<<"Лифт не сможет поднять этот груз!"<<endl;

} while((f_number<=0)||(f_number>get_weight()-cargo[i].get_pweight()));

cargo[i].put_load(f_number);

}

}

В данной реализации производится проверка вводимых значений, чтобы избежать некорректных данных. Например, задаваемые этажи должны быть в диапазоне от 1 до последнего в данном здании, начальный и конечный этажи не должны совпадать,  вес сопровождаемого груза должен быть больше нулевого и суммарный вес груза и сопровождающего его человека не должен быть больше грузоподъёмности лифта.

void entry(load &l)

Функция осуществляет изменение членов данных класса в связи со входом пассажира в лифт. Пример реализации функции приведён ниже:

void car_lift::entry(load &l)

{

l.put_in(true);

l.put_out(false);

put_wload(get_wload()+l.get_pweight()+l.get_load());

}

В данной реализации функция записывает значение «истина» в поле, определяющее нахождение данного груза в лифте и значение «ложь» - в поле, определяющее нахождение данного груза вне лифта. В поле, определяющее вес груза и пассажира в лифте, функция суммирует предыдущий вес, вес вошедшего пассажира и сопровождаемого груза.

void out(load &l)

Функция осуществляет изменение членов данных класса в связи с выходом пассажира из лифта. Пример реализации функции приведён ниже:

void car_lift::out(load &l)

{

l.put_in(false);

l.put_out(false);

put_wload(get_wload()-l.get_pweight()-l.get_load());

}

В данной реализации функция записывает значение «ложь» в поле, определяющее нахождение данного груза в лифте и значение «ложь» - в поле, определяющее нахождение данного груза вне лифта. В поле, определяющее вес груза и пассажира в лифте, функция записывает значение, полученное при вычитании из предыдущего веса вес вышедшего пассажира и сопровождаемого груза.

void overl(int floor)

Функция осуществляет изменение членов-данных класса в связи с временным выходом пассажира из лифта из-за перегрузки. Пример реализации функции приведён ниже:

void car_lift::overl(int floor)

{

grow_overl();

closegraph();

int i_number;

bool buf=true;

cout<<"Перегрузка!!! Один человек должен выйти!!!"<<endl;

do

{

cout<<"Введите номер пассажира, который выйдет"<<endl;

cin>>i_number;

buf=cargo[i_number-1].get_in();

if(cargo[i_number-1].get_in()==false) cout<<"Такого пассажира в лифте нет!"<<endl;

else

{

cargo[i_number-1].put_in(false);

cargo[i_number-1].put_out(true);

cargo[i_number-1].put_first(floor);

put_wload(get_wload()-cargo[i_number-1].get_pweight()-cargo[i_number1].get_load());

}

} while(buf==false);

init_graph();

grow(get_h());

}

void work()

Функция осуществляет работу лифта в зависимости от глобальной настройки и входных данных. Пример реализации функции приведён ниже:

void car_lift::work()

{

int first;

int last;

int sum=0;

int i_number;

int j;

bool over_l=false;

grow(get_h());

do

{

sum=0;

if(get_wload()==0)//груза в лифте нет

{

j=0;

while((cargo[j].get_out()==false)&&(j<qual)) j++;

first=cargo[j].get_first();

last=cargo[j].get_last();

entry(cargo[j]);

}

if(over_l==false)

{

for(int i=0;i<qual;i++)//проверка наличия вызовов на данном этаже

{

if((cargo[i].get_out()==true)&&(cargo[i].get_first()==first))

entry(cargo[i]);

}

}

if(last>first)//движение на подъем

{

if(get_stop()==true)

{

for(int i=0;i<qual;i++)//есть ли вызовы на промежуточных этажах

{

if((cargo[i].get_in()==true)&&(cargo[i].get_last()<last)&&

(cargo[i].get_last()>first))

last=cargo[i].get_last();

if((cargo[i].get_out()==true)&&(cargo[i].get_first()<last)&&

(cargo[i].get_first()>first))

last=cargo[i].get_first();

}

}

if (get_wload()>get_weight())//проверка на перегрузку

{

overl(first);

over_l=true;

}

else

{

first=up(first,last);//подъем

over_l=false;

}

}

else//движение на спуск

{

if(get_stop()==true)

{

for(int i=0; i<qual; i++)//есть ли вызовы на промежуточных этажах

{

if((cargo[i].get_in()==true)&&((cargo[i].get_last()>last)&&

(cargo[i].get_last()<first)))

last=cargo[i].get_last();

if((cargo[i].get_out()==true)&&((cargo[i].get_first()>last)&&

(cargo[i].get_first()<first)))

last=cargo[i].get_first();

}

}

if(get_wload()>get_weight())//проверка на перегрузку

{

overl(first);

over_l=true;

}

else

{

first=down(first,last);//спуск

over_l=false;

}

}

for(int i=0; i<qual; i++)//хочет ли кто-нибудь выйти на данном этаже

{

if((cargo[i].get_in()==true)&&(cargo[i].get_last()==first))

{

out(cargo[i]);

}

}

if(over_l==false)

{

for(i=0;i<qual;i++)//есть ли вызовы на данном этаже

{

if((cargo[i].get_out()==true)&&(cargo[i].get_first()==first))

{

entry(cargo[i]);

}

}

}

j=0;

while((cargo[j].get_in()==false)&&(j<qual)) j++;

last=cargo[j].get_last();//определение следующего этажа, 

//если в лифте есть груз

for(i=0; i<qual; i++)

if((cargo[i].get_out()==true)||(cargo[i].get_in()==true)) sum++;

if((get_wload()==0)&&(sum>0))//определение движения, 

//если в лифте нет груза

{

j=0;

while((cargo[j].get_out()==false)&&(j<qual)) j++;

last=cargo[j].get_first();

if(last>first) up(first,last);

else down(first,last);

}

} while(sum>0);//пока есть вызовы

delay(2000);

outtextxy(25,70,"Работа завершена! Нажмите 'Enter'");

}

В данной реализации функция определяет порядок обслуживания вызовов в зависимости от глобальной настройки лифта и входных данных. Работа лифта задаётся циклом с операциями в следующем порядке:

задаётся направление движения лифта; 

проверяется наличие вызовов на данном этаже;

проверяется, есть ли груз, для которого этот этаж конечный;

проверяется наличие вызовов на промежуточных этажах;

проверяется превышение грузоподъёмности;

осуществляется движение.

Цикл выполняется до тех пор, пока не будут обслужены все вызовы. 



Инструкция программисту



При написании класса «грузовой лифт» были использованы следующие классы:

			класс «груз», описывающий основные функции объекта «груз для перевозки». Этот класс используется для создания массива вызовов для грузового лифта;

			класс «лифт», описывающий основную функциональность лифта. Этот класс наследуется классом «грузовой лифт» с добавлением членов-данных и членов функций.

	Класс «грузовой лифт» предназначен для определения порядка обслуживания вызовов в зависимости от глобальной настройки лифта. Для наглядности кода был определён новый тип данных – bool, для работы с логическими переменными.

	Особое требование при работе с классом: так как функция work() работает в графическом режиме, необходимо вызывать функцию init_graph() перед вызовом функции work().


Демонстрационная программа



Текст программы



Далее приведена программа, демонстрирующая работу грузового лифта. Программа находится в файле lift_main.cpp.

void main()

{

clrscr();

int i_number=0;

int ch;

car_lift elevator;

elevator.global_tuning();

do

{

elevator.turning();

init_graph();

elevator.work();

getch();

closegraph();

cout<<"Продолжить работу?(y-да)"<<endl;

ch=getch();

} while (ch==121);

}


4.2 Инструкция пользователю



Программа демонстрирует работу грузового лифта. Для начала работы необходимо запустить файл lift_main.exe. После чего, следуя указаниям программы, необходимо произвести настройку работы лифта (эта настройка будет действовать в течение всей работы программы) и ввести исходные данные для работы. После завершения работы с одними данными, можно продолжить работу, введя новые. При вводе некорректной информации, программа выдаст предупреждение и можно будет повторить ввод. Для изменения настроек лифта, необходимо запустить программу заново.


Тестовый пример



После запуска файла lift_main.exe необходимо произвести настройку лифта:

Глобальная настройка работы лифта:

Грузоподъемность лифта (кг): 500

Активировать безопасность? ('да'-1) 1

Количество этажей в здании: 15

Останавливаться на промежуточных этажах? ('да'-1) 1

Затем ввести необходимые данные:

Ввод необходимых данных!

Введите количество человек, ожидающих лифт: 3

1-й вызов:

Начальный этаж: 1

Конечный этаж: 3

Вес груза (кг): 200

2-й вызов:

Начальный этаж: 2

Конечный этаж: 5

Вес груза (кг): 100

3-й вызов:

Начальный этаж: 2

Конечный этаж: 8

Вес груза (кг): 100

Во время работы программы на экране появляется следующая картинка:

Вид экрана во время движения  лифта (см. рис. 5.1)







Рис. 5.1  - Движение лифта



Вид экрана во время остановки лифта (см. рис. 5.2)







Рис. 5.2 – Остановка лифта



Вид экрана в момент перегрузки лифта (см. рис. 5.3)







Рис. 5.3 – Перегрузка лифта



Результаты работы программы:

Движение лифта: 1 – 2; 

Перегрузка!!! Один человек должен выйти!!!

Введите номер пассажира, который выйдет: 1

2 – 5; 5 – 8; 8 – 2; 2 – 3.





Заключение



В курсовой работе был создан класс «грузовой лифт», путём наследования от класса «лифт» и использования экземпляра класса «груз». На базе созданного класса была написана демонстрационная программа, показывающая работу грузового лифта в графическом режиме. Класс «грузовой лифт» может быть настроен на конкретные условия работы. Параметрами настройки служат:

		грузоподъёмность лифта;

		высота здания, в котором эксплуатируется лифт;

		политика обслуживания вызовов (останавливаться ли на промежуточных этажах);

		активация безопасного режима работы.

В классе продумана оптимизация работы лифта, которая базируется не только на скорости работы, но и на удобстве пассажиров.





Список использованных источников



1. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++, 2-е изд./ Пер. с англ.- М.: БИНОМ, 560 с.

2. Климова Л.М. Основы практического программирования на языке С++ -М.:  “Издательство ПРИОР”, 1999, 464с.

3. Шилдт Г. Самоучитель С++: Пер. с англ. - 3-е изд. – СПб.: БХВ-Петербург, 2004,  688 с.