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

28805
знаков
0
таблиц
2
изображения

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

}

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

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


4.         Демонстрационная программа 4.1       Текст программы

 

Далее приведена программа, демонстрирующая работу грузового лифта. Программа находится в файле 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. После чего, следуя указаниям программы, необходимо произвести настройку работы лифта (эта настройка будет действовать в течение всей работы программы) и ввести исходные данные для работы. После завершения работы с одними данными, можно продолжить работу, введя новые. При вводе некорректной информации, программа выдаст предупреждение и можно будет повторить ввод. Для изменения настроек лифта, необходимо запустить программу заново.


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

 

После запуска файла 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 с.


Информация о работе «Класс "Грузовой лифт"»
Раздел: Информатика, программирование
Количество знаков с пробелами: 28805
Количество таблиц: 0
Количество изображений: 2

Похожие работы

Скачать
48295
3
27

... числа редуктора Расчет передаточного числа редуктора выполняется так, чтобы максимальной скорости рабочего органа механизма соответствовала номи­нальная скорость двигателя. Для привода грузового лифта: Расчет и построение нагрузочной диаграммы двигателя Для проверки предварительно выбранного двигателя по нагреву выполним построение упрощенной нагрузочной диаграммы двигателя (т.е. ...

Скачать
45357
5
24

... режим работы, обеспечить выполнение требований по ускорению лифта и возможность его работы с разными грузами на подъем и на спуск. Кинематическая схема электропривода приведена на рисунке 1. Рисунок 1 - Кинематическая схема электропривода грузового лифта:1 – канатоведущий шкив; 2 –редуктор; 3 – тормозной шкив; 4 – двигатель; 5 – клеть; 6 – противовес. Технические данные транспортера ( ...

Скачать
96799
17
19

... в заделке (точка В) и момента в точке приложения нагрузки от канатной подвески (точка Е) (2.5) В реальных конструкциях лифтов величина Км ≥ 10, поэтому доля влияния моментов в узлах соединения балок со стойками очень мала, что делает вполне оправданным упрощенный расчет балок и стоек каркаса.   2.1.3 Устройство и расчет пола кабины Горизонтальная рама каркаса ...

Скачать
93864
9
6

... одежду заменяют новой. ЗАКЛЮЧЕНИЕ Курсовая работа выполнена в соответствии с утвержденным заданием. В данной работе были рассмотрены важнейшие аспекты организации технического обслуживания оборудования на банно – прачечном комбинате. При выполнении курсовой работы решены следующие задачи: рассмотрены теоретические аспекты планово – предупредительного ремонта на предприятии; изучена ...

0 комментариев


Наверх