- •Рейтингова система оцінювання знань та умінь з ооп 2012-2013 н.Р.
- •Вимоги до звіту з лабораторних робіт
- •Класи потоків Лабораторна робота 1
- •1.1 Теоретичні відомості
- •1.1.1. Методи класів потоків
- •1.1.2. Маніпулятори
- •1.1.3. Деякі методи класів файлових потоків
- •1.2 Приклад програми Умова задачі
- •Алгоритм задачі
- •Текст програми
- •Результати виконання програми
- •1.3 Варіанти завдань
- •1.4 Контрольні запитання
- •Інкапсуляція. Інтерфейси класів . Діаграми прецедентів і класів Лабораторна робота 2
- •2.1 Теоретичні відомості Етапи об’єктно-орієнтованого проектування та моделювання
- •Діаграма варіантів використання(use-case diagram)
- •Ідентифікація класів
- •Ідентифікація атрибутів
- •Ідентифікація операцій (методів)
- •Типові схеми uml діаграм
- •2.2 Програма роботи
- •2.3 Варіанти завдань
- •2.4 Приклад виконання роботи Задача
- •Об’єктно-орієнтоване проектування Зображення класів в uml
- •Ідентифікація атрибутів
- •Структура проекту
- •Інтерфейси та реалізації класів програми
- •2.5 Контрольні запитання
- •Конструктори та деструктори класів Діаграми прецедентів і класів Лабораторна робота 3
- •3.1 Теоретичні відомості
- •3.2 Програма роботи
- •3.3 Варіанти завдань
- •3.4 Приклад виконання роботи Задача
- •Реалізація конструкторів і деструкторів деяких класів
- •3.5 Контрольні запитання
- •Методи класів: аксесори, ітератори, утілити, предикатні функції . Діаграми класів, діяльності, послідовності Лабораторна робота № 4
- •4.1 Теоретичні відомості
- •4.2 Програма роботи
- •4.3 Варіанти завдань
- •4.4 Приклад виконання роботи Задача
- •Реалізація деяких методів-аксесорів, предикатних функцій, функцій-утілит, методів, які забезпечують функціональність об’єктів
- •Результати виконання роботи
- •4.5 Контрольні запитання
- •Константні та статичні члени класів. Вбудовані функції. Діаграми класів, послідовності Лабораторна робота № 5
- •5.1 Теоретичні відомості
- •5.2 Програма роботи
- •5.3 Варіанти завдань
- •5.4 Приклад виконання роботи Задача 5_1
- •Приклади деяких константних елементів даних і методів класів
- •Фрагмент результатів виконання роботи
- •Задача 5_2
- •Приклади деяких статичних елементів даних і методів класів
- •Фрагмент результатів виконання роботи
- •5.5 Контрольні запитання
- •Перевантаження операцій та функцій. Дружні функції Діаграми класів, станів і переходів Лабораторна робота 6
- •6.1 Теоретичні відомості
- •6.2 Програма роботи
- •6.3 Варіанти завдань
- •6.4 Приклад виконання роботи
- •6.5 Контрольні запитання
- •Просте успадкування класів. Поліморфізм. Віртуальні функції Діаграма класів, кооперацій. Лабораторна робота 7
- •7.1 Теоретичні відомості
- •7.2 Програма роботи
- •9.2. Приклад програми Умова задачі 9
- •Алгоритм задачі 9
- •Текст програми 9
- •Результати роботи програми 9
- •9.3. Варіанти завдань
- •9.4. Контрольні запитання
- •Методи внутрішнього сортування (сортування масивів) Лабораторна робота 10
- •Методи зовнішнього сортування (сортування файлів) Лабораторна робота 11
Результати виконання роботи
Рис. 4.6. Результати виконання роботи
4.5 Контрольні запитання
Яке призначення методів-аксесорів?.
Яке призначення функцій-утілит?
З якою метою в клас включають предикатні функції?
Як здійснити доступ до закритих елементів даних класу?
В чому полягає концепція інкапсуляції ООП?
Як реалізуються принципи концепції інкапсуляції?
Що таке зовнішній інтерфейс класу?
Які методи відносять до методів внутрішнього інтерфейсу?
Що означує термін „протокол класу”?
Які різновиди методів звичайно входять до складу класу?
Константні та статичні члени класів. Вбудовані функції. Діаграми класів, послідовності Лабораторна робота № 5
Мета роботи: вивчити особливості використання константних, статичних членів класу та вбудованих функцій. Скласти програму з використанням константних, статичних та inline функцій.
5.1 Теоретичні відомості
Дивись лекції
Константні функції та елементи даних класу слід вказувати для запобігання спроб випадкового змінення їх. Методи слід оголошувати яке const, якщо вони не змінюють об’єкт. Такими методами є методи-аксесори. Константні об’єкти можна тільки ініціалізувати через список ініціалізації в конструкторі. Константним членам класу не можна присвоювати значення. Конструктри та деструктори не можуть бути константними. Константні функції можуть викликати тільки інші константні функції.
5.2 Програма роботи
Доповнити інтерфейси та реалізації класів вбудованими (inline) функціями. Урахувати обмеження на використання певних операторів в тілі inline-функцій, які запобігають застосуванню макророзширень в місцях звернення до цих функцій.
Доповнити інтерфейси та реалізації класів константними функціями та атрибутами (const дані-члени та const функції-члени);
Доповнити інтерфейси та реалізації класів статичними функціями та атрибутами (static дані-члени та static функції-члени);
Протестувати програму, під час роботи якої слід виконати такі дії:
вивести повідомлення про використання констатних функцій та константних атрибутів;
вивести повідомлення про використання статичних функцій та атрибутів; показати значення атрибутів об’єктів;
ініціалізувати константні атрибути;
ініціалізувати статичні атрибути;
5.3 Варіанти завдань
Дивись варіанти завдань з лабораторної роботи 3
5.4 Приклад виконання роботи Задача 5_1
В програму внесені зміни щодо оголошення методів і даних в інтерфейсі класу та їх реалізацій:
Методи-аксесори не повинні змінювати об’єкт, тобто значення елементів даних класу, тому їх слід оголосити як const. Наприклад, Clock::GetTime(),Floor::GetNumber() тощо.
Предикатні функції визначають стан об’єкта та не змінюють його. Наприклад, Floor::IsOccupied()
Елементи даних класу оголошують як const, якщо нові значення їм не будь присвоюватися. Значення цих елементів повертають з функцій-членів класу, або використовують в умовах порівняння тощо. Наприклад, змінні Floor::floorNumber, FloorButton::floorNumber, Person::ID тощо.
Приклади деяких константних елементів даних і методів класів
// 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()const; //returns time private: int time; // clock's time }; #endif // CLOCK_H |
// clock.cpp #include <iostream> using namespace std; #include "clock.h" Clock::Clock() // constructor : time( 0 ) { } Clock::~Clock(){ }// destructor void Clock::tick()// increment time by 1 { time++; } int Clock::GetTime()const//return time { return time; } |
// elevator.h // Definition for class Elevator #ifndef ELEVATOR_H #define ELEVATOR_H #include "elevatorButton.h" #include "door.h" #include "bell.h"
//for using as parameters in functions class Floor; // forward declaration class Person; // forward declaration class Elevator { public: Elevator( Floor &, Floor & ); Elevator(Elevator&); ~Elevator(); void SummonElevator( int ); void PrepareToLeave( bool ); void ProcessTime(int); //give time
//lab6: board a passenger void PassengerEnters( Person* const );
void PassengerExits(); ElevatorButton elevatorButton; private: void ProcessPossibleArrival(); void ProcessPossibleDeparture(); void ArriveAtFloor( Floor & ); void Move(); bool moving; // elevator state int direction; // current direction int currentFloor; // current location int arrivalTime; //arrive at a floor Floor &floor1Ref;//reference to floor1 Floor &floor2Ref;//reference to floor2 Person *passengerPtr; Door door; Bell bell; }; #endif // ELEVATOR_H |
// elevator.cpp // implementation of class Elevator #include <iostream> using namespace std; #include "elevator.h" #include "person.h" #include "floor.h" // constructor initialization Elevator::Elevator( Floor &firstFloor, Floor &secondFloor):elevatorButton(*this) , moving(false), direction(0) , currentFloor(1), arrivalTime(0) , floor1Ref(firstFloor) , floor2Ref(secondFloor), passengerPtr(0) { cout << "elevator created" << endl; } //copy constructor Elevator::Elevator(Elevator& object) : elevatorButton( object.elevatorButton) , moving( object.moving) , direction( object.direction) , currentFloor( object.currentFloor) , arrivalTime( object.arrivalTime) , floor1Ref( object.floor1Ref) , floor2Ref( object.floor2Ref) , passengerPtr( object.passengerPtr) {cout<<"copy elevator created"<<endl; } Elevator::~Elevator() // destructor { cout << "elevator destroyed" << endl; } // give time to elevator void Elevator::ProcessTime(int time){} //..... //lab6: пасажир увійшов до ліфта void Elevator::PassengerEnters(Person* const personPtr) { passengerPtr = personPtr; cout<<"person "<<passengerPtr->GetID() << " enters elevator from floor " << currentFloor << endl; } //повідомлення ліфту про вихід пасажира void Elevator::PassengerExits() { passengerPtr = 0; } |
// floor.h // Definition for class Floor. #ifndef FLOOR_H #define FLOOR_H #include "floorButton.h" #include "light.h" #include "door.h"
class Elevator; // forward declaration class Person; // forward declaration class Floor { public: Floor( int, Elevator & ); ~Floor(); //lab6: return true if floor occupied bool IsOccupied()const;
//lab6: return floor's number int GetNumber()const;
//lab6: new person coming on floor void PersonArrives( Person* const);
//notify floor that elevator has arrived Person *elevatorArrived(); //notify floor that elevator is leaving void ElevatorLeaving(); //notify floor that person is leaving void PersonBoardingElevator(); FloorButton floorButton; private:
//lab6: the floor's number const int floorNumber;
Elevator& elevatorRef; Person* occupantPtr; Light light; }; #endif // FLOOR_H |
// floor.cpp // Implementation od 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?"floor1":"floor2") { cout << "floor " << floorNumber << " created" << endl; } // destructor Floor::~Floor() {cout << "floor " << floorNumber << " destroyed" << endl; }
//lab6: determine if floor is occupied bool Floor::IsOccupied() const { return ( occupantPtr != 0 ); }
//lab6: return this floor's number int Floor::GetNumber()const { return floorNumber; }
//lab6: pass person to floor void Floor::PersonArrives( Person* const personPtr ) { occupantPtr = personPtr;}
// notify floor that elevator has arrived Person *Floor::elevatorArrived() { return occupantPtr;} // tell floor that elevator is leaving void Floor::ElevatorLeaving() { } //. . . . . . . . . . . . . . . . |
// person.h // definition of class Person #ifndef PERSON_H #define PERSON_H #include<string> using namespace std;
class Floor; // forward declaration class Elevator; // forward declaration
class Person { public: Person();
Person( const int );//lab6: constructor
~Person(); // destructor Person( Person& ); //copy constructor Person( string tabnumber);
int GetID() const;//lab6: returns ID
void StepOntoFloor( Floor & ); void EnterElevator(Elevator&, Floor&);
void exitElevator(const Floor&, Elevator&) const; //lab6:
private: int personCount;//person’s number
const int ID; //lab6: person's ID # const int destinationFloor; }; #endif // PERSON_H |
/* person.cpp – подані тільки реалізації константних методів і тих, які використовують константні члени класу */ #include <iostream> #include<string> using namespace std; #include "person.h" #include "floor.h" #include "elevator.h"
/*lab6: default constructor – присвоєння константним членам значень в тілі конструктора заборонено */ Person::Person():ID(0),destinationFloor(0) { personCount=0; cout<<"default initialization of man take place - void object created"<<endl; }
// constructor-initialization Person::Person( int destFloor ) : ID(++personCount), personCount(0) , destinationFloor(destFloor) {cout<<"person "<<ID<<" created on floor "<<destinationFloor<<endl;}
//lab6:copy constructor – ініціалізація //тільки списком Person::Person(Person& man ) :ID(man.ID) , destinationFloor(man.destinationFloor) { personCount=man.personCount; cout<<"person (man) "<<ID<<" created on floor "<<destinationFloor<<" again"; }
//lab6:constructor transformation Person::Person( string tabnumber ) :ID(tabnumber[0]) ,destinationFloor(tabnumber[1]) { string str2 = tabnumber.substr(2,1); const char* s2=str2.c_str(); personCount=atoi(s2); cout<<"constructor transformation"<<endl; cout<<"person "<<ID<<" created on floor "<<destinationFloor<<" count="<< personCount<<endl; }
//lab6: метод-аксесор int Person::GetID() const { return ID; } // get the ID
//lab6: person exits elevator void Person::exitElevator(const Floor &floor, Elevator &elevator) const { cout<<"person "<<ID<<" exits elevator on floor " <<floor.GetNumber()<<endl; elevator.PassengerExits(); } |