Website Summary Files Commits Branches @commit @diff @stats
path: root / Week05 / Exercise03 / TaxDatabase.h
diff options
context:
space:
mode:
Commit571dc57f812a685bda7bd3baf8aaf2ef56feae65 (patch)
Author
 Syndamia <kamen@syndamia.com>
2026-03-28 16:19:58 +0200
Committer
 Syndamia <kamen@syndamia.com>
2026-03-28 16:19:58 +0200
Filesd69f560eccb705339f44be22369bb8fed025e642 /Week05/Exercise03/TaxDatabase.h
oop-2025-solutions-571dc57f812a685bda7bd3baf8aaf2ef56feae65.tar
oop-2025-solutions-571dc57f812a685bda7bd3baf8aaf2ef56feae65.tar.gz
oop-2025-solutions-571dc57f812a685bda7bd3baf8aaf2ef56feae65.zip
Parente5c06fbc864205a9736f07f9237ace80617ca471 (diff)
feat(Week05): Add solutions
1 files changed, 80 insertions, 0 deletions
-rw-r--r--Week05/Exercise03/TaxDatabase.h80
diff --git a/Week05/Exercise03/TaxDatabase.h b/Week05/Exercise03/TaxDatabase.h
new file mode 100644
index 0000000..89dd1ed
--- /dev/null
+++ b/Week05/Exercise03/TaxDatabase.h
@@ -0,0 +1,80 @@
+#ifndef _TAXDATABASE
+#define _TAXDATABASE
+
+#include "Person.h"
+#include "TaxReport.h"
+
+class TaxDatabase {
+ Person* people;
+ unsigned peopleCount;
+ unsigned peopleAllocated;
+
+ TaxReport* reports;
+ unsigned reportsCount;
+ unsigned reportsAllocated;
+
+ void free();
+ void copyFrom(const TaxDatabase& other);
+
+ void resizePeople();
+ void resizeReports();
+
+public:
+ TaxDatabase();
+ ~TaxDatabase();
+ TaxDatabase(const TaxDatabase& other);
+ TaxDatabase& operator=(const TaxDatabase& other);
+
+ TaxDatabase(TaxDatabase&& other);
+ TaxDatabase& operator=(TaxDatabase&& other);
+
+ bool RegisterPerson(const Person& person);
+ bool LogTaxReport(const TaxReport& report);
+
+ void PersonalReports(unsigned long long PN) const;
+ void YearlyReports(unsigned short year) const;
+
+ double YearlyAvgIncome(unsigned short year) const;
+ double YearlyTaxedIncome(unsigned short year) const;
+
+ const TaxReport* GetReport(unsigned long long PN, unsigned short year) const;
+ const TaxReport* GetReportByAge(unsigned long long PN, unsigned short age) const;
+
+ // Можем да дефинираме класове в други класове, можем да достъпим
+ // вътрешния клас с името "TaxDatabase::Reports".
+ // Достъпността на класа следва public/protected/private, в този
+ // случай класа е публичен.
+ class Reports {
+ TaxReport** reports;
+ unsigned reportsCount;
+
+ void copyFrom(const Reports& other);
+ void free();
+
+ public:
+ Reports();
+ ~Reports();
+ Reports(const Reports& other);
+ Reports& operator=(const Reports& other);
+
+ Reports(Reports&& other);
+ Reports& operator=(Reports&& other);
+
+ unsigned ReportsCount() const;
+ const TaxReport* At(unsigned index) const;
+
+ // Тези се използват единствено от GetReports и GetReportsByAge
+ // Тоест не позволяваме на върнатата стойност да бъде изменяна
+ void Allocate(unsigned size);
+ TaxReport** At(unsigned index);
+ };
+
+ const Reports GetReports(unsigned long long PN, unsigned short startYear, unsigned short endYear) const;
+ const Reports GetReportsByAge(unsigned long long PN, unsigned short startAge, unsigned short endAge) const;
+
+ /* Помощни функции */
+
+ const Person* GetPerson(unsigned long long PN) const;
+};
+
+#endif /* _TAXDATABASE */