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();//работа лифта
};
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());
}
В данной реализации функция записывает значение «истина» в поле, определяющее нахождение данного груза в лифте и значение «ложь» - в поле, определяющее нахождение данного груза вне лифта. В поле, определяющее вес груза и пассажира в лифте, функция суммирует предыдущий вес, вес вошедшего пассажира и сопровождаемого груза.
· 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'");
}
В данной реализации функция определяет порядок обслуживания вызовов в зависимости от глобальной настройки лифта и входных данных. Работа лифта задаётся циклом с операциями в следующем порядке:
1. задаётся направление движения лифта;
2. проверяется наличие вызовов на данном этаже;
3. проверяется, есть ли груз, для которого этот этаж конечный;
4. проверяется наличие вызовов на промежуточных этажах;
5. проверяется превышение грузоподъёмности;
6. осуществляется движение.
Цикл выполняется до тех пор, пока не будут обслужены все вызовы.
3.3 Инструкция программистуПри написании класса «грузовой лифт» были использованы следующие классы:
· класс «груз», описывающий основные функции объекта «груз для перевозки». Этот класс используется для создания массива вызовов для грузового лифта;
· класс «лифт», описывающий основную функциональность лифта. Этот класс наследуется классом «грузовой лифт» с добавлением членов-данных и членов функций.
Класс «грузовой лифт» предназначен для определения порядка обслуживания вызовов в зависимости от глобальной настройки лифта. Для наглядности кода был определён новый тип данных – 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
Во время работы программы на экране появляется следующая картинка:
1. Вид экрана во время движения лифта (см. рис. 5.1)
Рис. 5.1 - Движение лифта
2. Вид экрана во время остановки лифта (см. рис. 5.2)
Рис. 5.2 – Остановка лифта
3. Вид экрана в момент перегрузки лифта (см. рис. 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 с.
... числа редуктора Расчет передаточного числа редуктора выполняется так, чтобы максимальной скорости рабочего органа механизма соответствовала номинальная скорость двигателя. Для привода грузового лифта: Расчет и построение нагрузочной диаграммы двигателя Для проверки предварительно выбранного двигателя по нагреву выполним построение упрощенной нагрузочной диаграммы двигателя (т.е. ...
... режим работы, обеспечить выполнение требований по ускорению лифта и возможность его работы с разными грузами на подъем и на спуск. Кинематическая схема электропривода приведена на рисунке 1. Рисунок 1 - Кинематическая схема электропривода грузового лифта:1 – канатоведущий шкив; 2 –редуктор; 3 – тормозной шкив; 4 – двигатель; 5 – клеть; 6 – противовес. Технические данные транспортера ( ...
... в заделке (точка В) и момента в точке приложения нагрузки от канатной подвески (точка Е) (2.5) В реальных конструкциях лифтов величина Км ≥ 10, поэтому доля влияния моментов в узлах соединения балок со стойками очень мала, что делает вполне оправданным упрощенный расчет балок и стоек каркаса. 2.1.3 Устройство и расчет пола кабины Горизонтальная рама каркаса ...
... одежду заменяют новой. ЗАКЛЮЧЕНИЕ Курсовая работа выполнена в соответствии с утвержденным заданием. В данной работе были рассмотрены важнейшие аспекты организации технического обслуживания оборудования на банно – прачечном комбинате. При выполнении курсовой работы решены следующие задачи: рассмотрены теоретические аспекты планово – предупредительного ремонта на предприятии; изучена ...
0 комментариев