Класс "Грузовой лифт" (стр. 2 из 3)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

Далее приведены заголовочные 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();//работа лифта

};

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

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

· 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());

}

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