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
|
# Задачи - ООП, Седмица 5, 18.03.2026
'define expected-reading 6 min
'define created 18 March 2026
'define edited 18 March 2026
[$pagenav]
.warn За всеки клас имплементирайте [=голяма петица!=] Това включва "move" семантики!
## За решаване
### Задача 1
.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05/Exercise01 Решение]
Реализирайте клас [`NumSeries`], който съхранява динамично-заделен масив от числа с плаваща запетая, техния размер и индекса на последния елемент.
Класа трябва да има публични методи, [=достъпни и за константни обекти=]:
.unordered
- [`Push`], който слага подадения елемент на последната позиция.
Това е единствения начин да се добавят елементи.
Ако цялата заделена памет е запълнена, масива да се уголеми.
- [`At`], който по подаден индекс връща елемент.
Да има проверка дали индекса е валиден (дали елемент на този индекс е бил [`Push`]-нат).
При невалиден индекс върнете [url https://en.cppreference.com/w/cpp/numeric/math/NAN.html NaN].
- [`Length`], който връща броя [`Push`]-нати елементи
### Задача 2
.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05/Exercise02 Решение]
Реализирайте клас [`String`], който съхранява динамично-заделен низ.
Допълнително, реализирайте конструктор, приемащ [`const char*`] и публичи методи, [=достъпни за константни обекти=] (когато смислено):
.unordered
- [`Substring`], който връща нов низ, който е под-низ на текущия.
Като аргументи приема начален индекс и дължина.
- [`Concat`], който приема низ и го "слепва" в края на текущия низ.
Реализирайте клас [`Text`], който съхранява динамично-заделена последователност от редове текст ([`String`]-ове).
Реализирайте публични методи, [=достъпни за константни обекти=] (когато смислено):
.unordered
- [`LineCount`], който връща броя редове в текста
- [`WordCount`], който връща броя думи в текста.
Дума за нашите цели е всяка последователност от букви, която не съдържа шпация.
- [`SubText`], който по подадени начален и краен ред, и начална и крайна колона, връща [`Text`], съдържащ само тези (части от) низове
### Задача 3
.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05/Exercise03 Решение]
Реализирайте клас [`Person`], който съхранява трите имена, телефонен номер, имейл, година на раждане и ЕГН (personal number) на човек.
Препоръчително е да използвате [`String`] клас, подобен на този от предходната задача ([=но имплементиран от Вас=]).
Реализирайте конструктор, който приема тези данни.
Реализирайте клас [`TaxReport`], който съхранява ЕГН, година, сума приходи и процент данък от приходите.
Реализирайте конструктор, който приема тези данни.
Реализирайте клас [`TaxDatabase`], който съхранява динамичо-заделени количества от [`Person`] и [`TaxReport`] обекти.
Реализирайте публични методи, [=достъпни за константни обекти=] (когато смислено):
.unordered
- [`RegisterPerson`], който добавя човек.
Нека да връща [`bool`], дали успешно е добавен човек.
ЕГН-тата, имейлите и телефонните номера трябва да са различни между всички потребители.
Количеството хора е неограничено, вътрешната памет трябва да се реоразмерява.
- [`LogTagReport`], който добавя данъчна декларация.
Нека да връща [`bool`], дали е успешно добавена.
Всяка декларация се различава по комбинацията от ЕГН и година.
Количеството декларации е неограничено, вътрешната памет трябва да се реоразмерява.
- [`PersonalReports`], който по подадено ЕГН изкарва на екрана всички данни за човека и всички данни за всички негови данъчни декларации
- [`YearlyReports`], който по подадена година изкарва на екрана всички данъчни декларации през подадената година.
За всяка декларация изкарайте вместо ЕГН, първото име, фамилия и възраст на съответния човек.
- [`YearlyAvgIncome`], който по подадена година връща средния приход на всички потребители
- [`YearlyTaxedIncome`], който по подадена година връща общия приход от данъци на всички потребители
- [`GetReport`], който по подадено ЕГН и година връща съответната декларация
- [`GetReportByAge`], който по подадено ЕГН и възраст връща съответната декларация
- [`GetReports`], който по подадено ЕГН, начална година и крайна година връща [*последователност*] от данъчни декларации.
Ще е нужно да имплементирате помощен клас.
- [`GetReportsByAge`], който по подадено ЕГН, начална възраст и крайна възраст връща [*последователност*] от данъчни декларации
## За самоподготовка
### Задача 4
Реализирайте клас [`User`], който съхранява ЕГН, имейл и парола на потребител.
Реализирайте конструктор с всички тези параметри.
Реализирайте клас [`BankAccount`], който съхранява [`AccountId`] и последователност от транзакции.
Всяка транзакция съдържа промяна по баланса (положително число за вложена сума и отрицателна за изтеглена) и дата (ден, месец, година, час, минути, секунди).
Реализирайте нужните помощни класове/структури.
Реализирайте публични методи, [=достъпни за константни обекти=] (когато смислено):
.unordered
- [`Balance`], който връща текущия баланс в акаунта
- [`Balance`], който по подадена дата и час връща баланса към този момент от времето
- [`AddTransaction`], който добавя транзакция към акаунта
Реализирайте структура [`UserBankAccount`], която съхранява ЕГН и [`AccountId`].
Реализирайте клас [`BankingSystem`], който съхранява последователности от [`User`]-и, [`BankAccount`]-и и [`UserBankAccount`]-и.
[`UserBankAccount`]-ите свързват [`User`]-ите и [`BankAccount`]-ите.
Реализирайте публични методи, [=достъпни за константни обекти=] (когато смислено):
.unordered
- [`RegisterBankAccount`], който по подадени данни добавя потребител и неговия [`BankAccount`] (сметка).
Ако се подаде нов потребител, неговите данни да се запазят.
Ако потребителя вече е записан, единствено да се запише новия [`BankAccount`] (и връзката му с потребителя; един потребител може да има много сметки).
- [`RegisterTransaction`], която по подадено ЕГН, [`AccountId`], сума и време запазва съответната транзакция в акаунта на потребителя
- [`TotalBalance`], която по подадено ЕГН връща общия баланс на всички сметки на потребителя
- [`NegativeBalances`], която по подадено ЕГН и време връща броя сметки, които са имали отрицателен общ баланс към подаденото време
- [`CanBeDeleted`], която по подадено ЕГН връща последователност от [`AccountId`]-та на сметки, които имат баланс 0 (и следователно могат да бъдат изтрити).
Ще е нужно да имплементирате помощен клас.
- [`SuspiciousAccounts`], която връща всички имейли и [`AccountId`]-та на сметки, които изглеждат съмнителни.
Съмнителни са тези сметки, чиито най-скорошни 20 транзакции са се случили за по-малко от минута.
Може да е нужно да разширите имплементацията на някой клас.
- [`Debtors`], която връща първо име, фамилия и имейл на всички на всички потребители, чиито сметки имат отрицателен баланс.
Ще е нужно да имплементирате помощен клас.
|