aboutsummaryrefslogtreecommitdiff
path: root/week12/Exercise4
diff options
context:
space:
mode:
authorSyndamia <kamen@syndamia.com>2024-05-10 12:27:14 +0300
committerSyndamia <kamen@syndamia.com>2024-05-10 12:27:14 +0300
commiteb6305c8b0a71a613a34edbcabdaf1fde259451d (patch)
tree2ba4402c82569810ab4287175670193597cc52d4 /week12/Exercise4
parent8dd9b39fa54a91030cdd5fe71973f78f7e8089e0 (diff)
downloadoop-2023-solutions-eb6305c8b0a71a613a34edbcabdaf1fde259451d.tar
oop-2023-solutions-eb6305c8b0a71a613a34edbcabdaf1fde259451d.tar.gz
oop-2023-solutions-eb6305c8b0a71a613a34edbcabdaf1fde259451d.zip
[w12] Finished ex 4
Diffstat (limited to 'week12/Exercise4')
-rw-r--r--week12/Exercise4/Company.cpp19
-rw-r--r--week12/Exercise4/Company.h13
-rw-r--r--week12/Exercise4/Developer.cpp22
-rw-r--r--week12/Exercise4/Developer.h16
-rw-r--r--week12/Exercise4/Employee.h15
-rw-r--r--week12/Exercise4/Manager.cpp98
-rw-r--r--week12/Exercise4/Manager.h27
-rw-r--r--week12/Exercise4/Person.cpp58
-rw-r--r--week12/Exercise4/Person.h20
9 files changed, 288 insertions, 0 deletions
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);
+};