Summary Files Commits Branches @commit @diff @stats
path: root / src / teaching
diff options
context:
space:
mode:
Commit9e78691898bdde389a5d1fb4e0b9e00b440d2b07 (patch)
Author
 Syndamia <kamen@syndamia.com>
2026-03-18 09:04:17 +0200
Committer
 Syndamia <kamen@syndamia.com>
2026-03-18 09:04:17 +0200
Files82cb1f87c37981b14d3fb15b986a63144c4991fe /src/teaching
syndamia.com-9e78691898bdde389a5d1fb4e0b9e00b440d2b07.tar
syndamia.com-9e78691898bdde389a5d1fb4e0b9e00b440d2b07.tar.gz
syndamia.com-9e78691898bdde389a5d1fb4e0b9e00b440d2b07.zip
Parent801c510151a6fd5964442d2b532da038fe32cdcb (diff)
feat(teaching/oop-2025/w05): Add exercises
2 files changed, 117 insertions, 0 deletions
-rw-r--r--src/teaching/oop-2025/index.du9
-rw-r--r--src/teaching/oop-2025/week05/index.du108
diff --git a/src/teaching/oop-2025/index.du b/src/teaching/oop-2025/index.du
index 7dcf4a4..71c87e8 100644
--- a/src/teaching/oop-2025/index.du
+++ b/src/teaching/oop-2025/index.du
@@ -61,3 +61,12 @@
|:
[url ./week04 Задачи]
|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04 Решения]
+
+|: 5
+|: 18.03.2026
+|: Голяма петица
+
+|:
+|:
+|:
+[url ./week05 Задачи]
diff --git a/src/teaching/oop-2025/week05/index.du b/src/teaching/oop-2025/week05/index.du
new file mode 100644
index 0000000..0c0101c
--- /dev/null
+++ b/src/teaching/oop-2025/week05/index.du
@@ -0,0 +1,108 @@
+# Задачи - ООП, Седмица 5, 18.03.2026
+
+'define expected-reading 6 min
+'define created 18 March 2026
+'define edited 18 March 2026
+[$pagenav]
+
+.warn За всеки клас имплементирайте [=голяма петица!=] Това включва "move" семантики!
+
+## За решаване
+
+### Задача 1
+
+Реализирайте клас [`NumSeries`], който съхранява динамично-заделен масив от числа с плаваща запетая, техния размер и индекса на последния елемент.
+
+Класа трябва да има публични методи, [=достъпни и за константни обекти=]:
+.unordered
+- [`Push`], който слага подадения елемент на последната позиция.
+ Това е единствения начин да се добавят елементи.
+ Ако цялата заделена памет е запълнена, масива да се уголеми.
+- [`At`], който по подаден индекс връща елемент.
+ Да има проверка дали индекса е валиден (дали елемент на този индекс е бил [`Push`]-нат).
+ При невалиден индекс върнете [url https://en.cppreference.com/w/cpp/numeric/math/NAN.html NaN].
+- [`Length`], който връща броя [`Push`]-нати елементи
+
+### Задача 2
+
+Реализирайте клас [`String`], който съхранява динамично-заделен низ.
+
+Допълнително, реализирайте конструктор, приемащ [`const char*`] и публичи методи, [=достъпни за константни обекти=] (когато смислено):
+.unordered
+- [`Substring`], който връща нов низ, който е под-низ на текущия.
+ Като аргументи приема начален индекс и дължина.
+- [`Concat`], който приема низ и го "слепва" в края на текущия низ.
+
+Реализирайте клас [`Text`], който съхранява динамично-заделена последователност от редове текст ([`String`]-ове).
+Реализирайте публични методи, [=достъпни за константни обекти=] (когато смислено):
+.unordered
+- [`LineCount`], който връща броя редове в текста
+- [`WordCount`], който връща броя думи в текста.
+ Дума за нашите цели е всяка последователност от букви, която не съдържа шпация.
+- [`SubText`], който по подадени начален и краен ред, и начална и крайна колона, връща [`Text`], съдържащ само тези (части от) низове
+
+### Задача 3
+
+Реализирайте клас [`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`], която връща първо име, фамилия и имейл на всички на всички потребители, чиито сметки имат отрицателен баланс.
+ Ще е нужно да имплементирате помощен клас.