aboutsummaryrefslogtreecommitdiff
path: root/week03/Exercise8.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'week03/Exercise8.cpp')
-rw-r--r--week03/Exercise8.cpp125
1 files changed, 125 insertions, 0 deletions
diff --git a/week03/Exercise8.cpp b/week03/Exercise8.cpp
new file mode 100644
index 0000000..3019efa
--- /dev/null
+++ b/week03/Exercise8.cpp
@@ -0,0 +1,125 @@
+struct ResidentialBuilding {
+ float apartmentPrice;
+ unsigned floors;
+ unsigned peoplePerFloor;
+ bool hasBasement;
+ bool hasAttic;
+ bool hasParking;
+};
+
+struct CommercialBuilding {
+ float shopPrice;
+ unsigned parkingFloors;
+ unsigned shopFloors;
+ unsigned shopsPerFloor;
+};
+
+struct City {
+private:
+ struct ResidentialPair {
+ ResidentialBuilding* residential;
+ unsigned tenants;
+ };
+ struct CommercialPair {
+ CommercialBuilding* commercial;
+ unsigned shops;
+ };
+
+ ResidentialPair* residentials;
+ int lastResidential;
+ CommercialPair* commercials;
+ int lastCommercial;
+
+ // 0 - no building
+ // >0 - index from residentials, starting from 1
+ // <0 - index from commercials, starting from -1
+ int** city;
+ int size;
+
+ bool cityFull() {
+ return lastResidential == size * size || lastCommercial == size * size;
+ }
+
+public:
+ City() {
+ size = 5;
+ lastResidential = lastCommercial = 0;
+
+ city = new int*[size];
+ for (int i = 0; i < size; i++) {
+ city[i] = new int[size];
+ for (int j = 0; j < size; j++) {
+ city[i][j] = 0;
+ }
+ }
+
+ residentials = new ResidentialPair[size * size];
+ commercials = new CommercialPair[size * size];
+ }
+ ~City() {
+ for (int i = 0; i < lastResidential; i++) {
+ delete residentials[i].residential;
+ }
+ delete[] residentials;
+ for (int i = 0; i < lastCommercial; i++) {
+ delete commercials[i].commercial;
+ }
+ delete[] commercials;
+ for (int i = 0; i < size; i++) {
+ delete[] city[i];
+ }
+ delete[] city;
+ }
+
+ void BuildResidential(const ResidentialBuilding& rb, unsigned tenants, int coordX, int coordY) {
+ if (cityFull() || city[coordX][coordY] != 0) return;
+
+ residentials[lastResidential] = { new ResidentialBuilding(rb), tenants };
+ city[coordX][coordY] = lastResidential + 1;
+ lastResidential++;
+ }
+
+ void BuildCommercial(const CommercialBuilding& cb, unsigned shops, int coordX, int coordY) {
+ if (cityFull() || city[coordX][coordY] != 0) return;
+
+ commercials[lastCommercial] = { new CommercialBuilding(cb), shops };
+ city[coordX][coordY] = -(lastCommercial + 1);
+ lastCommercial++;
+ }
+
+ void DemolishBuilding(int coordX, int coordY) {
+ int& index = city[coordX][coordY];
+ if (index == 0) {
+ return;
+ }
+
+ if (index > 0) {
+ index -= 1;
+ delete residentials[index].residential;
+ for (int i = index; i < lastResidential - 1; i++) {
+ residentials[i] = residentials[i+1];
+ }
+ lastResidential--;
+ residentials[lastResidential] = { nullptr, 0 };
+ }
+ else {
+ index = -index - 1;
+ delete commercials[index].commercial;
+ for (int i = index; i < lastResidential - 1; i++) {
+ commercials[i] = commercials[i+1];
+ }
+ lastCommercial--;
+ commercials[lastCommercial] = { nullptr, 0 };
+ }
+ index = 0;
+ }
+};
+
+int main() {
+ City city;
+ city.BuildResidential({ 10000.0, 6, 7, true, true, false }, 21, 0, 0);
+ city.BuildResidential({ 100000.0, 5, 5, false, true, false }, 10, 2, 2);
+ city.BuildCommercial({ 12000.0, 0, 2, 1 }, 1, 2, 3);
+ city.DemolishBuilding(2, 3);
+ city.BuildCommercial({ 130800.0, 2, 5, 4 }, 8, 2, 3);
+}