сargo – массив элементов класса «груз»;
qual – количество человек вызовов лифта.
Над членами-данными класса определены следующие операции:
· установка количества пассажиров, ожидающих лифт;
· ввод данных для работы лифта;
· изменение членов-данных класса в связи со входом пассажира в лифт;
· изменение членов-данных класса в связи с выходом пассажира из лифта;
· изменение членов-данных класса в связи с перегрузкой лифта;
· движение лифта.
Диаграмма классов показывает классы и их отношения, тем самым, представляя логический аспект проекта. Отдельная диаграмма классов представляет определенный ракурс структуры классов. На стадии анализа используются диаграммы классов, чтобы выделить общие роли и обязанности сущностей, обеспечивающих требуемое поведение системы. На стадии проектирования пользуются диаграммой классов, чтобы передать структуру классов, формирующих архитектуру системы.
Два главных элемента диаграммы классов - это классы и их основные отношения.
Основные атрибуты и функции данных классов, а также их взаимосвязь и иерархию удобно показать на диаграмме классов (рисунок 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 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 (это связано демонстрационной программой).
Функция используется для подъёма кабины лифта с этажа 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;
}
В данной реализации функция лишь подсвечивает номера этажей во время движения. А после прибытия лифта подсвечивает надпись «Двери открыты!».
Функция используется для спуска кабины лифта с этажа 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 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 car_lift::entry(load &l)
{
l.put_in(true);
l.put_out(false);
put_wload(get_wload()+l.get_pweight()+l.get_load());
}
В данной реализации функция записывает значение «истина» в поле, определяющее нахождение данного груза в лифте и значение «ложь» - в поле, определяющее нахождение данного груза вне лифта. В поле, определяющее вес груза и пассажира в лифте, функция суммирует предыдущий вес, вес вошедшего пассажира и сопровождаемого груза.