diff options
Diffstat (limited to 'week12')
| -rw-r--r-- | week12/Exercise3/TelecommunicationCompany.cpp | 14 | ||||
| -rw-r--r-- | week12/Exercise4/Company.cpp | 19 | ||||
| -rw-r--r-- | week12/Exercise4/Company.h | 13 | ||||
| -rw-r--r-- | week12/Exercise4/Developer.cpp | 22 | ||||
| -rw-r--r-- | week12/Exercise4/Developer.h | 16 | ||||
| -rw-r--r-- | week12/Exercise4/Employee.h | 15 | ||||
| -rw-r--r-- | week12/Exercise4/Manager.cpp | 98 | ||||
| -rw-r--r-- | week12/Exercise4/Manager.h | 27 | ||||
| -rw-r--r-- | week12/Exercise4/Person.cpp | 58 | ||||
| -rw-r--r-- | week12/Exercise4/Person.h | 20 |
10 files changed, 295 insertions, 7 deletions
diff --git a/week12/Exercise3/TelecommunicationCompany.cpp b/week12/Exercise3/TelecommunicationCompany.cpp index b059edb..7b877ca 100644 --- a/week12/Exercise3/TelecommunicationCompany.cpp +++ b/week12/Exercise3/TelecommunicationCompany.cpp @@ -1,13 +1,6 @@ #include "TelecommunicationCompany.h" #include "MobileDevice.h" -void TelecommunicationCompany::free() { - for (int i = 0; i < size; i++) { - delete devices[i]; - } - delete[] devices; -} - void TelecommunicationCompany::resize() { allocated *= 2; MobileDevice** moreDevices = new MobileDevice*[allocated]; @@ -18,6 +11,13 @@ void TelecommunicationCompany::resize() { devices = moreDevices; } +void TelecommunicationCompany::free() { + for (int i = 0; i < size; i++) { + delete devices[i]; + } + delete[] devices; +} + TelecommunicationCompany::TelecommunicationCompany() { devices = nullptr; allocated = size = 0; diff --git a/week12/Exercise4/Company.cpp b/week12/Exercise4/Company.cpp new file mode 100644 index 0000000..9b172bd --- /dev/null +++ b/week12/Exercise4/Company.cpp @@ -0,0 +1,19 @@ +#include "Company.h" +#include <iostream> + +Company::~Company() { + for (int i = 0; i < 128; i++) { + delete employees[i]; + } +} + +float Company::PaymentDifference() { + float total = 0, performanced = 0; + for (int i = 0; i < 128; i++) { + if (employees[i] == nullptr) continue; + + total += employees[i]->paycheck; + performanced += employees[i]->paycheck * employees[i]->efficiency; + } + return total - performanced; +} diff --git a/week12/Exercise4/Company.h b/week12/Exercise4/Company.h new file mode 100644 index 0000000..63bcb64 --- /dev/null +++ b/week12/Exercise4/Company.h @@ -0,0 +1,13 @@ +#pragma once +#include "Person.h" +#include "Employee.h" + +class Company { + Employee* employees[128]; + +public: + ~Company(); + + float PaymentDifference(); + void WorkloadByAge(); +}; diff --git a/week12/Exercise4/Developer.cpp b/week12/Exercise4/Developer.cpp new file mode 100644 index 0000000..aa97908 --- /dev/null +++ b/week12/Exercise4/Developer.cpp @@ -0,0 +1,22 @@ +#include "Developer.h" + +Developer& Developer::operator++() { + ++countProjectsSoonRelease; + return *this; +} +Developer& Developer::operator++(int) { + countProjects++; + return *this; +} +Developer& Developer::operator--() { + --countProjectsSoonRelease; + return *this; +} +Developer& Developer::operator--(int) { + countProjects--; + return *this; +} + +float Developer::Workload() { + return 1.1 * countProjects + 2.3 * countProjectsSoonRelease; +} diff --git a/week12/Exercise4/Developer.h b/week12/Exercise4/Developer.h new file mode 100644 index 0000000..aa5fec3 --- /dev/null +++ b/week12/Exercise4/Developer.h @@ -0,0 +1,16 @@ +#pragma once +#include "Employee.h" +#include "Person.h" + +class Developer : public Employee, public Person { + unsigned countProjects; + unsigned countProjectsSoonRelease; + +public: + Developer& operator++(); + Developer& operator++(int); + Developer& operator--(); + Developer& operator--(int); + + virtual float Workload() override; +}; diff --git a/week12/Exercise4/Employee.h b/week12/Exercise4/Employee.h new file mode 100644 index 0000000..82170fd --- /dev/null +++ b/week12/Exercise4/Employee.h @@ -0,0 +1,15 @@ +#pragma once + +class Employee { + int id; + float paycheck; + float efficiency; + +public: + virtual ~Employee() = default; + + virtual float Workload() = 0; + + // Това е за удобство, по-добрия вариант е гетъри и сетъри + friend class Company; +}; diff --git a/week12/Exercise4/Manager.cpp b/week12/Exercise4/Manager.cpp new file mode 100644 index 0000000..d78ee6d --- /dev/null +++ b/week12/Exercise4/Manager.cpp @@ -0,0 +1,98 @@ +#include "Manager.h" + +void Manager::resize() { + allocated *= 2; + Person* moreManages = new Person[allocated]; + for (int i = 0; i < size; i++) { + moreManages[i] = manages[i]; + } + delete[] manages; + manages = moreManages; +} + +void Manager::free() { + delete[] manages; +} + +void Manager::copyFrom(const Manager& other) { + this->size = other.size; + this->allocated = other.allocated; + this->manages = new Person[allocated + 1]; + for (int i = 0; i < size; i++) { + manages[i] = other.manages[i]; + } +} + +Manager::Manager() { + manages = nullptr; + size = allocated = 0; +} + +Manager::~Manager() { + free(); +} + +Manager::Manager(const Manager& other) { + copyFrom(other); +} + +Manager& Manager::operator=(const Manager& other) { + if (this != &other) { + free(); + copyFrom(other); + } + return *this; +} + +Manager::Manager(Manager&& other) { + this->allocated = other.allocated; + this->size = other.size; + this->manages = other.manages; + other.manages = nullptr; +} + +Manager& Manager::operator=(Manager&& other) { + if (this != &other) { + free(); + + this->allocated = other.allocated; + this->size = other.size; + this->manages = other.manages; + other.manages = nullptr; + } + return *this; +} + +void Manager::StartManaging(Person& newEmp) { + for (int i = 0; i < size; i++) { + if (manages[i] == newEmp) { + throw "Person already managed!"; + } + } + + if (size >= allocated) { + resize(); + } + manages[size++] = newEmp; +} + +void Manager::StopManaging(const Person& oldEmp) { + int i; + for (i = 0; i < size; i++) { + if (manages[i] == oldEmp) { + break; + } + } + if (i == size) { + throw "Not managing employee!"; + } + + for (; i < size - 1; i++) { + manages[i] = manages[i+1]; + } + size--; +} + +float Manager::Workload() { + return 0.6 * size; +} diff --git a/week12/Exercise4/Manager.h b/week12/Exercise4/Manager.h new file mode 100644 index 0000000..eee8f9f --- /dev/null +++ b/week12/Exercise4/Manager.h @@ -0,0 +1,27 @@ +#pragma once +#include "Employee.h" +#include "Person.h" + +class Manager : public Person, public Employee { + Person* manages; + unsigned size; + unsigned allocated; + + void resize(); + + void free(); + void copyFrom(const Manager& other); + +public: + Manager(); + ~Manager(); + Manager(const Manager& other); + Manager& operator=(const Manager& other); + Manager(Manager&& other); + Manager& operator=(Manager&& other); + + void StartManaging(Person& newEmp); + void StopManaging(const Person& oldEmp); + + virtual float Workload() override; +}; diff --git a/week12/Exercise4/Person.cpp b/week12/Exercise4/Person.cpp new file mode 100644 index 0000000..5d1ec09 --- /dev/null +++ b/week12/Exercise4/Person.cpp @@ -0,0 +1,58 @@ +#include "Person.h" +#include <cstring> + +void Person::free() { + delete[] name; +} + +void Person::copyFrom(const Person& other) { + this->age = other.age; + this->name = new char[strlen(other.name) + 1]; + strcpy(this->name, other.name); +} + +Person::Person() { + this->name = nullptr; + age = 0; +} + +Person::~Person() { + free(); +} + +Person::Person(const Person& other) { + copyFrom(other); +} + +Person& Person::operator=(const Person& other) { + if (this != &other) { + free(); + copyFrom(other); + } + return *this; +} + +Person::Person(Person&& other) { + this->age = other.age; + this->name = other.name; + other.name = nullptr; +} + +Person& Person::operator=(Person&& other) { + if (this != &other) { + free(); + + this->age = other.age; + this->name = other.name; + other.name = nullptr; + } + return *this; +} + +bool operator==(const Person& left, const Person& right) { + return strcmp(left.name, right.name) == 0; +} + +bool operator!=(const Person& left, const Person& right) { + return !(left == right); +} diff --git a/week12/Exercise4/Person.h b/week12/Exercise4/Person.h new file mode 100644 index 0000000..030ff8b --- /dev/null +++ b/week12/Exercise4/Person.h @@ -0,0 +1,20 @@ +#pragma once + +class Person { + char* name; + unsigned age; + + void free(); + void copyFrom(const Person& other); + +public: + Person(); + virtual ~Person(); + Person(const Person& other); + Person& operator=(const Person& other); + Person(Person&& other); + Person& operator=(Person&& other); + + friend bool operator==(const Person& left, const Person& right); + friend bool operator!=(const Person& left, const Person& right); +}; |
