Формальное описание класса
⇐ ПредыдущаяСтр 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'"); } В данной реализации функция определяет порядок обслуживания вызовов в зависимости от глобальной настройки лифта и входных данных. Работа лифта задаётся циклом с операциями в следующем порядке: 1. задаётся направление движения лифта; 2. проверяется наличие вызовов на данном этаже; 3. проверяется, есть ли груз, для которого этот этаж конечный; 4. проверяется наличие вызовов на промежуточных этажах; 5. проверяется превышение грузоподъёмности; 6. осуществляется движение. Цикл выполняется до тех пор, пока не будут обслужены все вызовы.
Инструкция программисту
При написании класса «грузовой лифт» были использованы следующие классы:
· класс «груз», описывающий основные функции объекта «груз для перевозки». Этот класс используется для создания массива вызовов для грузового лифта; · класс «лифт», описывающий основную функциональность лифта. Этот класс наследуется классом «грузовой лифт» с добавлением членов-данных и членов функций. Класс «грузовой лифт» предназначен для определения порядка обслуживания вызовов в зависимости от глобальной настройки лифта. Для наглядности кода был определён новый тип данных – bool, для работы с логическими переменными. Особое требование при работе с классом: так как функция work() работает в графическом режиме, необходимо вызывать функцию init_graph() перед вызовом функции work().
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|