aboutsummaryrefslogtreecommitdiff
path: root/week05/Exercise7.cpp
blob: 38da2e078636b2e3c8f36cbb9e8d2bff2d23c57e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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;
		}
	}
};