diff options
2 files changed, 117 insertions, 0 deletions
| -rw-r--r-- | src/teaching/oop-2025/index.du | 9 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week05/index.du | 108 |
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`], която връща първо име, фамилия и имейл на всички на всички потребители, чиито сметки имат отрицателен баланс. + Ще е нужно да имплементирате помощен клас. |