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