aboutsummaryrefslogtreecommitdiff
path: root/week05/Exercise7.cpp
diff options
context:
space:
mode:
authorSyndamia <kamen@syndamia.com>2024-03-28 09:43:24 +0200
committerSyndamia <kamen@syndamia.com>2024-03-28 09:43:24 +0200
commit70c2c3eab85bee3100ce1c749af03937a6e11e17 (patch)
treede11302f6187f2234485381af99cf131aa9e210b /week05/Exercise7.cpp
parent96fc3d9205fb4fd8ecff960f44ae2e3def929882 (diff)
downloadoop-2023-solutions-70c2c3eab85bee3100ce1c749af03937a6e11e17.tar
oop-2023-solutions-70c2c3eab85bee3100ce1c749af03937a6e11e17.tar.gz
oop-2023-solutions-70c2c3eab85bee3100ce1c749af03937a6e11e17.zip
[w5] Added solutions to exercises 1-7
Diffstat (limited to 'week05/Exercise7.cpp')
-rw-r--r--week05/Exercise7.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/week05/Exercise7.cpp b/week05/Exercise7.cpp
new file mode 100644
index 0000000..38da2e0
--- /dev/null
+++ b/week05/Exercise7.cpp
@@ -0,0 +1,94 @@
+#include <iostream>
+#include <random>
+
+int rand(int min, int max) {
+ return rand() % max + min;
+}
+
+struct WaterMeter {
+private:
+ double usedWater;
+
+public:
+ WaterMeter() {
+ usedWater = 0.0;
+ }
+
+ void AddWater(double amount) {
+ usedWater += amount;
+ }
+ void Print() {
+ std::cout << usedWater;
+ }
+};
+
+struct Building {
+private:
+ WaterMeter* meters;
+ unsigned size;
+
+ void free() {
+ delete[] meters;
+ }
+ void copyFrom(const Building& other) {
+ this->size = other.size;
+ this->meters = new WaterMeter[size];
+ for (int i = 0; i < size; i++) {
+ this->meters[i] = other.meters[i];
+ }
+ }
+
+public:
+ Building(unsigned size) {
+ this->size = size;
+ meters = new WaterMeter[size];
+ }
+
+ Building() {
+ meters = nullptr;
+ size = 0;
+ }
+ ~Building() {
+ free();
+ }
+ Building(const Building& other) {
+ copyFrom(other);
+ }
+ Building& operator=(const Building& other) {
+ if (this != &other) {
+ free();
+ copyFrom(other);
+ }
+ return *this;
+ }
+
+ void SimulateDay() {
+ for (int i = 0; i < size; i++) {
+ meters[i].AddWater(rand(0, 999) / 100.0);
+ }
+ }
+ void SimulateMonth() {
+ WaterMeter** reports = new WaterMeter*[5];
+ for (int i = 0; i < 5; i++) {
+ reports[i] = new WaterMeter[size];
+ }
+
+ for (int day = 0; day <= 30; day++) {
+ SimulateDay();
+ if (day % 5 == 0 && day > 0) {
+ unsigned reportIndex = day / 5 - 1;
+ for (int i = 0; i < size; i++) {
+ reports[reportIndex][i] = meters[i];
+ }
+ }
+ }
+
+ for (int meterI = 0; meterI < size; meterI++) {
+ for (int reportI = 0; reportI < 5; reportI++) {
+ reports[reportI][meterI].Print();
+ std::cout << " ";
+ }
+ std::cout << std::endl;
+ }
+ }
+};