Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод указ к лабораторным работам ООП 3 семест...doc
Скачиваний:
5
Добавлен:
13.11.2019
Размер:
22.34 Mб
Скачать

4.3 Варіанти завдань

Дивись варіанти завдань з лабораторної роботи 3

4.4 Приклад виконання роботи Задача

Умову задачі дивись у лаб роб 3

Відкриті (public) методи-аксесори забезпечують прямий доступ до змінних класу. Як правило функції типу get() повертають значення змінних класу, а функції типу set() встановлюють певні значення змінних. Найчастіше функції типу set() викликаються у конструкторах класу.

Відкриті предикатні функції визначають стан об’єктів, який позначається хибністю чи істинностю певних умов. Наприклад, визначити стан кнопки (натиснута чи не натиснута) можна функцією, яка повертає значення типу bool. В нашому прикладі в класи включені функції, наприклад, Floor::IsOccupied() для встановлення факту зайнятості ліфта чи появи пасажира на поверху, FloorButton::PressButton() для визначення факту натиснення кнопки тощо.

Функції-утілити завжди є закритими членами класу. Вони викликаються у відкритих функціях-членах класу і призначені для спрощення обробки розрахунків для об’єктів класу. Функції-утілити є методами внутрішнього інтерфейсу. Їх слід приховувати від клієнтів класу, оскільки вони не призначені для спілкування з об’єктом. Відкриті функції класу желегують свої функціональні обов’язки закритим функціям-утілитам. Делегування функціональності означуєьбся викликами функцій-утілит в тілі відкритою функції класу. Наприклад, в клас Scheduler включені закриті функції: ScheduleTime() для планування прибуття ліфта на поверх, CreateNewPerson() для створення нового пасажира, HandleArrivals() для управління прибуттям пасажира на поверх тощо. Усі ці функції викликаються в тілі функції ProcessTime().

Методи, що віддзеркалюють функціональність об’єкта, тобто моделюють сам процес його діяльності, є відкритими функціями.

Реалізація деяких методів-аксесорів, предикатних функцій, функцій-утілит, методів, які забезпечують функціональність об’єктів

// building.h

// Definition for class Building.

#ifndef BUILDING_H

#define BUILDING_H

#include "elevator.h"

#include "floor.h"

#include "clock.h"

#include "scheduler.h"

class Building {

public:

Building(); // constructor

Building(Building&); //copy constructor

~Building(); // destructor

// run simulation for specified time

void RunSimulation( int );

Elevator& GetElevator();

private:

Floor floor1; // floor1 object

Floor floor2; // floor2 object

Elevator elevator; // elevator object

Clock clock; // clock object

Scheduler scheduler;//scheduler object

};

#endif // BUILDING_H

// building.cpp

// Member function for class Building.

#include <iostream>

using namespace std;

#include "building.h"

Building::Building() // constructor

: floor1(1 , elevator ),

floor2(2 , elevator ),

elevator( floor1, floor2 ),

scheduler( floor1, floor2 )

{ cout << "building created" << endl; }

//copy constructor

Building::Building(Building& object)

:floor1(1 , object.elevator ),

floor2(2 , object.elevator ),

elevator( object.floor1, object.floor2 ),

scheduler( object.floor1, object.floor2 )

{cout << "second building created" << endl;}

Building::~Building() // destructor

{ cout << "building destroyed" << endl; }

//method-accessor

Elevator& Building:: GetElevator()

{ return elevator;}

// functional method - control the simu//lation -

void Building::RunSimulation(int totalTime){

int currentTime = 0;

while ( currentTime < totalTime ) {

clock.tick();

currentTime = clock.GetTime();

cout<<"TIME: "<<currentTime<<endl;

scheduler.ProcessTime(currentTime);

cin.get(); // stop pouput to screen

}

}

// clock.h

// Definition for class Clock.

#ifndef CLOCK_H

#define CLOCK_H

class Clock {

public:

Clock(); // constructor

~Clock(); // destructor

void tick();//increment clock by second

int GetTime(); //returns current time

private:

int time; // clock's time

};

#endif // CLOCK_H

// clock.cpp

// Member function of class Clock.

#include <iostream>

using namespace std;

#include "clock.h"

Clock::Clock() // constructor

: time( 0 ) { }

Clock::~Clock(){ } // destructor

//functional method - increment time

void Clock::tick()

{ time++; }

//method-accessor

int Clock::GetTime()//return current time

{ return time; }

// scheduler.h

// defintion for class Scheduler

#ifndef SCHEDULER_H

#define SCHEDULER_H

class Floor; // forward declaration

class Scheduler {

public:

Scheduler( Floor &, Floor & );

~Scheduler();

void ProcessTime( int );

private:

//утілита–планувальник прибуття на поверх

void ScheduleTime(Floor & );

//утілита–затримка часу до появи пасажира

void DelayTime( Floor & );

//утілита-створення нового пасажира

void CreateNewPerson( Floor & );

/*утілита-управління прибуття м пасажира

на поверх*/

void HandleArrivals( Floor &, int );

Floor &floor1Ref;

Floor &floor2Ref;

// lab5: added attributes

int currentClockTime; //поточний час

int floor1ArrivalTime; //час прибуття //на поверх 1

int floor2ArrivalTime; //час прибуття }; //на поверх 2

#endif // SCHEDULER_H

// scheduler.cpp

//implementation of class Scheduler

#include <iostream>

using namespace std;

#include <cstdlib>

#include <ctime>

#include "scheduler.h"

#include "floor.h"

#include "person.h"

// constructor for lab5 is modified

Scheduler::Scheduler( Floor &firstFloor, Floor &secondFloor )

: floor1Ref( firstFloor )

, floor2Ref( secondFloor )

, currentClockTime(0) //added for lab5

{ // added for lab5

srand(time(0));//random number generator

cout << "scheduler created" << endl;

// schedule first arrivals for floors

ScheduleTime( floor1Ref );

ScheduleTime( floor2Ref );

}

//lab5: метод-утілита для планування

//прибуття ліфта на поверх

void Scheduler::ScheduleTime(Floor &floor) {

int floorNumber = floor.GetNumber();

int arrivalTime = currentClockTime+(5+rand()%16);

floorNumber == 1 ?

floor1ArrivalTime = arrivalTime :

floor2ArrivalTime = arrivalTime;

cout<<"schedules next person for floor" <<floorNumber<<" at time "<<arrivalTime

<< endl;

}

// lab5: метод, який делегує свої

//повноваження утілитам

void Scheduler::ProcessTime( int time ){

currentClockTime=time;//поточний час

// прибуття на поверх 1

HandleArrivals(floor1Ref,currentClockTime );

// прибуття на поверх 2

HandleArrivals(floor2Ref,currentClockTime );

}

// lab5: утілита

void Scheduler::HandleArrivals( Floor &floor, int time ){

int floorNumber = floor.GetNumber();

int arrivalTime=(floorNumber == 1 ) ?

floor1ArrivalTime: floor2ArrivalTime;

}

// floor.cpp

// implementation of class Floor.

#include <iostream>

using namespace std;

#include "floor.h"

#include "person.h"

#include "elevator.h"

// constructor

Floor::Floor(int number, Elevator &elevatorHandle )

: floorButton( number, elevatorHandle ),

floorNumber( number ),

elevatorRef( elevatorHandle ),

occupantPtr ( 0 ),

light(floorNumber==1?"floor 1":"floor 2")

{ cout << "floor "<<floorNumber<<" created"<< endl; }

Floor::~Floor() // destructor

{ cout << "floor " << floorNumber << " destroyed" << endl; }

// метод предикатний (lab5)

bool Floor::IsOccupied()

{ return ( occupantPtr != 0 );}

// метод-аксесор (lab5)

int Floor::GetNumber()

{ return floorNumber; }

// метод-аксесор (lab5)

Person *Floor::elevatorArrived()

{ return occupantPtr;}

// pass person to floor

void Floor::PersonArrives( Person* personPtr ){ }

// tell floor that elevator is leaving

void Floor::ElevatorLeaving()

{ }

// notifies floor that person is leaving

void Floor::PersonBoardingElevator()

{ }

// elevatorSimulation.cpp

// Driver for the simulation.

#include <iostream>

using namespace std;

#include <string>

#include "building.h"

#include "person.h"

void main(){

int duration; //length of simulation

cout << "Enter run time: ";

cin >> duration;

cin.ignore(); // ignore return char

Building office1;//create the building

Person man; //default constructor

string code;

cout<<"enter string code for man"<<endl;

cin>>code;

Person one(code); //constructor-//transformation: string to 3*int

cout<<endl<<"*** ELEVATOR SIMULATION BEGINS ***" <<endl<<endl;

Person manager(1);

//copy constructor

Building office2=office1;

//copy constructor

Elevator elevator2=office2.GetElevator();

//copy constructor

Person clerk=manager;

cout<<" in new office"<<endl;

office1.RunSimulation( duration );

// start simulation

cout<<"*** ELEVATOR SIMULATION ENDS ***" << endl;

system("pause");

}

Повний код дивись на сервері