Summary Files Commits Branches @commit @diff @stats
path: root / src / teaching / oop-2025 / week05 / index.du
blob: e7de9e302f60e66ccf37cced2640d4981f35f72e (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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
'def title Задачи - ООП, Седмица 5, 18.03.2026
'def  desc Условията на задачите за упражнение.

# {title}

{pagenav 6 min;18 March 2026;18 March 2026}

.warn За всеки клас имплементирайте {b голяма петица!} Това включва "move" семантики!

## За решаване

### Задача 1

.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05/Exercise01}

Реализирайте клас {` NumSeries}, който съхранява динамично-заделен масив от числа с плаваща запетая, техния размер и индекса на последния елемент.

Класа трябва да има публични методи, {b достъпни и за константни обекти}:
.unordered
- {` Push}, който слага подадения елемент на последната позиция.
  Това е единствения начин да се добавят елементи.
  Ако цялата заделена памет е запълнена, масива да се уголеми.
- {` At}, който по подаден индекс връща елемент.
  Да има проверка дали индекса е валиден (дали елемент на този индекс е бил {` Push}-нат).
  При невалиден индекс върнете {url NaN;https://en.cppreference.com/w/cpp/numeric/math/NAN.html}.
- {` Length}, който връща броя {` Push}-нати елементи

### Задача 2

.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05/Exercise02}

Реализирайте клас {` String}, който съхранява динамично-заделен низ.

Допълнително, реализирайте конструктор, приемащ {` const char*} и публичи методи, {b достъпни за константни обекти} (когато смислено):
.unordered
- {` Substring}, който връща нов низ, който е под-низ на текущия.
  Като аргументи приема начален индекс и дължина.
- {` Concat}, който приема низ и го "слепва" в края на текущия низ.

Реализирайте клас {` Text}, който съхранява динамично-заделена последователност от редове текст ({` String}-ове).
Реализирайте публични методи, {b достъпни за константни обекти} (когато смислено):
.unordered
- {` LineCount}, който връща броя редове в текста
- {` WordCount}, който връща броя думи в текста.
  Дума за нашите цели е всяка последователност от букви, която не съдържа шпация.
- {` SubText}, който по подадени начален и краен ред, и начална и крайна колона, връща {` Text}, съдържащ само тези (части от) низове

### Задача 3

.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05/Exercise03}

Реализирайте клас {` Person}, който съхранява трите имена, телефонен номер, имейл, година на раждане и ЕГН (personal number) на човек.
Препоръчително е да използвате {` String} клас, подобен на този от предходната задача ({b но имплементиран от Вас}).
Реализирайте конструктор, който приема тези данни.

Реализирайте клас {` TaxReport}, който съхранява ЕГН, година, сума приходи и процент данък от приходите.
Реализирайте конструктор, който приема тези данни.

Реализирайте клас {` TaxDatabase}, който съхранява динамичо-заделени количества от {` Person} и {` TaxReport} обекти.
Реализирайте публични методи, {b достъпни за константни обекти} (когато смислено):
.unordered
- {` RegisterPerson}, който добавя човек.
  Нека да връща {` bool}, дали успешно е добавен човек.
  ЕГН-тата, имейлите и телефонните номера трябва да са различни между всички потребители.
  Количеството хора е неограничено, вътрешната памет трябва да се реоразмерява.
- {` LogTagReport}, който добавя данъчна декларация.
  Нека да връща {` bool}, дали е успешно добавена.
  Всяка декларация се различава по комбинацията от ЕГН и година.
  Количеството декларации е неограничено, вътрешната памет трябва да се реоразмерява.
- {` PersonalReports}, който по подадено ЕГН изкарва на екрана всички данни за човека и всички данни за всички негови данъчни декларации
- {` YearlyReports}, който по подадена година изкарва на екрана всички данъчни декларации през подадената година.
  За всяка декларация изкарайте вместо ЕГН, първото име, фамилия и възраст на съответния човек.
- {` YearlyAvgIncome}, който по подадена година връща средния приход на всички потребители
- {` YearlyTaxedIncome}, който по подадена година връща общия приход от данъци на всички потребители
- {` GetReport}, който по подадено ЕГН и година връща съответната декларация
- {` GetReportByAge}, който по подадено ЕГН и възраст връща съответната декларация
- {` GetReports}, който по подадено ЕГН, начална година и крайна година връща {i последователност} от данъчни декларации.
  Ще е нужно да имплементирате помощен клас.
- {` GetReportsByAge}, който по подадено ЕГН, начална възраст и крайна възраст връща {i последователност} от данъчни декларации

## За самоподготовка

### Задача 4

Реализирайте клас {` User}, който съхранява ЕГН, имейл и парола на потребител.
Реализирайте конструктор с всички тези параметри.

Реализирайте клас {` BankAccount}, който съхранява {` AccountId} и последователност от транзакции.
Всяка транзакция съдържа промяна по баланса (положително число за вложена сума и отрицателна за изтеглена) и дата (ден, месец, година, час, минути, секунди).
Реализирайте нужните помощни класове/структури.
Реализирайте публични методи, {b достъпни за константни обекти} (когато смислено):
.unordered
- {` Balance}, който връща текущия баланс в акаунта
- {` Balance}, който по подадена дата и час връща баланса към този момент от времето
- {` AddTransaction}, който добавя транзакция към акаунта

Реализирайте структура {` UserBankAccount}, която съхранява ЕГН и {` AccountId}.

Реализирайте клас {` BankingSystem}, който съхранява последователности от {` User}-и, {` BankAccount}-и и {` UserBankAccount}-и.
{` UserBankAccount}-ите свързват {` User}-ите и {` BankAccount}-ите.

Реализирайте публични методи, {b достъпни за константни обекти} (когато смислено):
.unordered
- {` RegisterBankAccount}, който по подадени данни добавя потребител и неговия {` BankAccount} (сметка).
  Ако се подаде нов потребител, неговите данни да се запазят.
  Ако потребителя вече е записан, единствено да се запише новия {` BankAccount} (и връзката му с потребителя; един потребител може да има много сметки).
- {` RegisterTransaction}, която по подадено ЕГН, {` AccountId}, сума и време запазва съответната транзакция в акаунта на потребителя
- {` TotalBalance}, която по подадено ЕГН връща общия баланс на всички сметки на потребителя
- {` NegativeBalances}, която по подадено ЕГН и време връща броя сметки, които са имали отрицателен общ баланс към подаденото време
- {` CanBeDeleted}, която по подадено ЕГН връща последователност от {` AccountId}-та на сметки, които имат баланс 0 (и следователно могат да бъдат изтрити).
  Ще е нужно да имплементирате помощен клас.
- {` SuspiciousAccounts}, която връща всички имейли и {` AccountId}-та на сметки, които изглеждат съмнителни.
  Съмнителни са тези сметки, чиито най-скорошни 20 транзакции са се случили за по-малко от минута.
  Може да е нужно да разширите имплементацията на някой клас.
- {` Debtors}, която връща първо име, фамилия и имейл на всички на всички потребители, чиито сметки имат отрицателен баланс.
  Ще е нужно да имплементирате помощен клас.