diff options
Merge branch 'update_dunbar' into 'master'
feat!: Update dunbar markup
See merge request Syndamia/syndamiadotcom!17
18 files changed, 691 insertions, 674 deletions
| -rw-r--r-- | src/teaching/oop-2025/index.du | 82 | ||||
| -rw-r--r-- | src/teaching/oop-2025/oop-notes/index.du | 44 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week01/index.du | 104 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week01/intro.du | 28 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week02/index.du | 124 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week03/index.du | 286 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week04/index.du | 60 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week05/index.du | 120 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week06/index.du | 74 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week07/index.du | 26 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week08/index.du | 44 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week09/index.du | 94 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week10/index.du | 55 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week11/index.du | 82 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week12/index.du | 10 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week13/index.du | 64 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week14/index.du | 30 | ||||
| -rw-r--r-- | src/teaching/oop-2025/week15/index.du | 38 |
diff --git a/src/teaching/oop-2025/index.du b/src/teaching/oop-2025/index.du index 6ca7131..5933359 100644 --- a/src/teaching/oop-2025/index.du +++ b/src/teaching/oop-2025/index.du @@ -1,21 +1,25 @@ -# Обектно-ориентирано програмиране - практикум, Компютърни науки, 5 група +'def title Обектно-ориентирано програмиране - практикум, Компютърни науки, 5 група +'def desc Материали на проведените през 2025/2026 практикуми по Обектно-ориентирано програмиране на Компютърни науки (2 поток), 5 група. + +# {title} Материали на проведените през 2025/2026 практикуми по Увод в програмирането на Компютърни науки (2 поток), 5 група. -[=Зала:=] ФМИ 309 [$dbarsep] -[=Време:=] 10:00 - 12:00 [$dbarsep] -[=Ден:=] Сряда +{b Зала:} ФМИ 309 {dbarsep} +{b Време:} 10:00 - 12:00 {dbarsep} +{b Ден:} Сряда -[=Директни връзки:=] -[url ../upp-2025/week01/introduction.html?a#section-3 Контакт с мен] -| [url https://github.com/Syndamia/oop-2025-solutions Решения на задачи] -| [url https://github.com/18ivan18/ObjectOrientedProgramming2026 Материали от семинари] -| [url https://learn.fmi.uni-sofia.bg/course/view.php?id=12155 Курс в мудъл] +{b Директни връзки:} +{url Контакт с мен;../upp-2025/week01/introduction.html?a#section-3} +| {url Решения на задачи;https://github.com/Syndamia/oop-2025-solutions} +| {url Материали от семинари;https://github.com/18ivan18/ObjectOrientedProgramming2026} +| {url Курс в мудъл;https://learn.fmi.uni-sofia.bg/course/view.php?id=12155} -[=Допълнителни ресурси:=] -[url ./oop-notes Бележки по ООП при C++] +{b Допълнителни ресурси:} +{url Бележки по ООП при C++;./oop-notes} -:table_3 +:table +:3 |= № |= Дата |= Материали @@ -27,13 +31,13 @@ |: |: |: -[url ./week01/intro.html?a Уводни бележки] +{url Уводни бележки;./week01/intro.html?a} |: |: |: -[url ./week01 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01 Решения] +{url Задачи;./week01} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01} |: 2 |: 25.02.2026 @@ -42,8 +46,8 @@ |: |: |: -[url ./week02 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02 Решения] +{url Задачи;./week02} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02} |: 3 |: 04.03.2026 @@ -52,8 +56,8 @@ |: |: |: -[url ./week03 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week03 Решения] +{url Задачи;./week03} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week03} |: 4 |: 11.03.2026 @@ -62,8 +66,8 @@ |: |: |: -[url ./week04 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04 Решения] +{url Задачи;./week04} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04} |: 5 |: 18.03.2026 @@ -72,8 +76,8 @@ |: |: |: -[url ./week05 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05 Решения] +{url Задачи;./week05} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05} |: 6 |: 25.03.2026 @@ -82,8 +86,8 @@ |: |: |: -[url ./week06 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06 Решения] +{url Задачи;./week06} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06} |: 7 |: 01.04.2026 @@ -92,8 +96,8 @@ |: |: |: -[url ./week07 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week07 Решения] +{url Задачи;./week07} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week07} |: 8 |: 08.04.2026 @@ -102,8 +106,8 @@ |: |: |: -[url ./week08 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week08 Решения] +{url Задачи;./week08} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week08} |: 9 |: 15.04.2026 @@ -112,8 +116,8 @@ |: |: |: -[url ./week09 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09 Решения] +{url Задачи;./week09} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09} |: 10 |: 22.04.2026 @@ -122,8 +126,8 @@ |: |: |: -[url ./week10 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10 Решения] +{url Задачи;./week10} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10} |: 11 |: 29.04.2026 @@ -132,8 +136,8 @@ |: |: |: -[url ./week11 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11 Решения] +{url Задачи;./week11} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11} |: 12 |: 13.05.2026 @@ -142,7 +146,7 @@ |: |: |: -[url ./week12 Задачи] +{url Задачи;./week12} |: 13 |: 20.05.2026 @@ -151,7 +155,7 @@ |: |: |: -[url ./week13 Задачи] +{url Задачи;./week13} |: 14 |: 27.05.2026 @@ -160,7 +164,7 @@ |: |: |: -[url ./week14 Задачи] +{url Задачи;./week14} |: 15 |: 03.06.2026 @@ -169,4 +173,4 @@ |: |: |: -[url ./week15 Задачи] +{url Задачи;./week15} diff --git a/src/teaching/oop-2025/oop-notes/index.du b/src/teaching/oop-2025/oop-notes/index.du index c3641fa..4b11a5d 100644 --- a/src/teaching/oop-2025/oop-notes/index.du +++ b/src/teaching/oop-2025/oop-notes/index.du @@ -1,48 +1,48 @@ -# Бележки по ООП при C++ - ООП, КН, 2025-2026 +'def title Бележки по ООП при C++ - ООП, КН, 2025-2026 +'def desc Полезна информация и детайли относно обектно-ориентираното програмиране при C++ -'define expected-reading 2 min -'define created 18 March 2026 -'define edited 18 March 2026 -[$pagenav] +# {title} + +{pagenav 2 min;18 March 2026;18 March 2026} Този документ съдържа редица полезна информация и детайли относно обектно-ориентираното програмиране при C++. ## Голяма петица формат -```c++ -'include ./RuleOfFive.cpp +```cpp +'snippet 1 $ ./RuleOfFive.cpp -## [`&&A`], rvalue и rvalue reference +## {` &&A}, rvalue и rvalue reference -[`lvalue`] е всяка стойност, която има "име". +{` lvalue} е всяка стойност, която има "име". Това са аргументи на функции, променливи, ... -[`rvalue`] е всяка стойност за която нямаме "име". +{` rvalue} е всяка стойност за която нямаме "име". Най-често срещаните са върнатите стойноти от функция/оператор. -Тези стойности са временни и идеята е че ще бъдат изтрити (и на практика, данните им ще бъдат копирани/пренесени в нещо с име, [`lvalue`]). +Тези стойности са временни и идеята е че ще бъдат изтрити (и на практика, данните им ще бъдат копирани/пренесени в нещо с име, {` lvalue}). -Можем да правим референции върху [`rvalue`]: -```c++ +Можем да правим референции върху {` rvalue}: +```cpp A&& rvalueRef = functionWhichReturnsA(); -Обаче, тези референции дават (временно) име към [`rvalue`]-то. -Това означава, че те самите стават [`lvalue`]. +Обаче, тези референции дават (временно) име към {` rvalue}-то. +Това означава, че те самите стават {` lvalue}. -Поради тази прична не можем да имаме повече от една [`rvalue`] референция към едно [`rvalue`]: -```c++ +Поради тази прична не можем да имаме повече от една {` rvalue} референция към едно {` rvalue}: +```cpp A&& ref1 = functionWhichReturnsA(); A&& ref2 = ref1; // Грешка! -И не можем да подаваме аргумент [`rvalue`] на друга функция: -```c++ +И не можем да подаваме аргумент {` rvalue} на друга функция: +```cpp void foo(A&& ref1) { - ... + \... } void bar(A&& ref2) { foo(ref2); // Грешка! } \n\n -[*Съпътстващи ресурси:*] +{i Съпътстващи ресурси:} .bulleted -- [url https://web.archive.org/web/20200627194253/https://thbecker.net/articles/rvalue_references/section_05.html https://thbecker.net/articles/rvalue_references/section_05.html] +- {url https://thbecker.net/articles/rvalue_references/section_05.html;https://web.archive.org/web/20200627194253/https://thbecker.net/articles/rvalue_references/section_05.html} diff --git a/src/teaching/oop-2025/week01/index.du b/src/teaching/oop-2025/week01/index.du index 8279b83..10d9b08 100644 --- a/src/teaching/oop-2025/week01/index.du +++ b/src/teaching/oop-2025/week01/index.du @@ -1,23 +1,23 @@ -# Задачи - ООП, Седмица 1, 18.02.2026 +'def title Задачи - ООП, Седмица 1, 18.02.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 2 min -'define created 17 February 2026 -'define edited 22 February 2026 -[$pagenav] +# {title} -.warn Както винаги, [=НЕ=] може да използвате външни библиотеки и (почти) всичко от стандартната библиотека! +{pagenav 2 min;17 February 2026;22 February 2026} -.important [*(22.02.2026)*] По-подробни условия, оправени някои грешки в условията. +.warn Както винаги, {b НЕ} може да използвате външни библиотеки и (почти) всичко от стандартната библиотека! + +.important {i (22.02.2026)} По-подробни условия, оправени някои грешки в условията. ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01/Exercise01} Реализирайте следните функции: -```c++ +```cpp // Създава нова динамично-заделена матрица int** newMatrix(unsigned rows, unsigned cols); // Изтрива динамично-заделена матрица @@ -25,13 +25,14 @@ void deleteMatrix(int**& matrix, unsigned rows); // Запишете nullptr в // Връща сумата на всички елементи в матрицата int sumMatrix(const int** matrix, unsigned rows, unsigned cols); -Поставете техните имплементации във файл [`matrix.cpp`] и техните дефиниции в [`matrix.h`]. -Естествено, главната функция [=трябва да се намира извън [`matrix.cpp`]!=] +Поставете техните имплементации във файл {` matrix.cpp} и техните дефиниции в {` matrix.h}. +Естествено, главната функция {b трябва да се намира извън {` matrix.cpp}!} От входа получавате размерите и стойностите на две матрици с цели числа. Изкарайте разликата, между сумата на елементите на първата матрица и на втората матрица. -:table_2 +:table +:2 |= Вход |= Изход @@ -52,13 +53,14 @@ int sumMatrix(const int** matrix, unsigned rows, unsigned cols); .comment 45 - 163 = -118 + ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01/Exercise02} Реализирайте следните функции: -```c++ +```cpp // Сума на стойностите в elements int sum(const int* elements, unsigned length); // Средно аритметично на стойностите в elements @@ -70,17 +72,18 @@ int smallest(const int* elements, unsigned length); // Връща индекса на първото срещане на elementToSearch unsigned findIndex(const int* elements, unsigned length, int elementToSearch); -Поставете техните имплементации в [`arrmath.cpp`] и техните дефиниции в [`arrmath.h`]. +Поставете техните имплементации в {` arrmath.cpp} и техните дефиниции в {` arrmath.h}. Направете всички нужни проверки за коректност на аргументите на функциите! -От входа получавате цяло неотрицателно число [`N`] и след това [`N`] на брой цели числа. +От входа получавате цяло неотрицателно число {` N} и след това {` N} на брой цели числа. -Трябва да изкарате средното аритметично на всички елементи [*между*] най-малкия и най-големия (включително). +Трябва да изкарате средното аритметично на всички елементи {i между} най-малкия и най-големия (включително). Ако най-големия и/или най-малкия се среща повече от един път, използвайте неговото първо срещане. -Използвайте максимално функциите от [`arrmath`]! +Използвайте максимално функциите от {` arrmath}! -:table_2 +:table +:2 |= Вход |= Изход @@ -94,13 +97,14 @@ unsigned findIndex(const int* elements, unsigned length, int elementToSearch); |: 2.8 + ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01/Exercise03} -Реализирайте следните функции във файлове [`stringHelpers.cpp`] и [`stringHelpers.h`]: +Реализирайте следните функции във файлове {` stringHelpers.cpp} и {` stringHelpers.h}: -```c++ +```cpp // Създава динамично-заделен низ по подадената дължина char* newString(unsigned length); // Създава динамично-заделен низ, копие на подадения низ @@ -111,9 +115,9 @@ char* concatStrings(const char* first, const char* second, const char* separator // Освобождава паметта на динамичо-заделен низ void deleteString(char*& string); // Запишете nullptr в string! -Реализирайте следните функции във файлове [`ioHelpers.cpp`] и [`ioHelpers.h`]: +Реализирайте следните функции във файлове {` ioHelpers.cpp} и {` ioHelpers.h}: -```c++ +```cpp // Прочита от потребителския вход цяло число между min и max включително, // като предоставя prompt преди въведената стойност // При невалидна стойност, пита пак за вход @@ -127,44 +131,44 @@ double readDouble(const char* prompt, double min, double max); // При невалидна стойност, пита пак за вход char* readString(const char* prompt); -За реализацията им използвайте [`stringHelpers`]! +За реализацията им използвайте {` stringHelpers}! Реализирате система за запазване на ученици. -Всеки ученик има две имена и оценка (по шестобалната система, между [`2.0`] и [`6.0`]). +Всеки ученик има две имена и оценка (по шестобалната система, между {` 2.0} и {` 6.0}). -Използвайки [`ioHelpers`], поискайте от потребителя брой ученици. +Използвайки {` ioHelpers}, поискайте от потребителя брой ученици. След това, за всеки ученик, поискайте неговото име, фамилия и оценка (поотделно). -За всеки ученик запазаете името му като един низ във формата [`"<ИМЕ> <ФАМИЛИЯ>"`]. +За всеки ученик запазаете името му като един низ във формата {` "<ИМЕ> <ФАМИЛИЯ>"}. Не запазвайте име и фамилия като отделни стойности! Накрая изкарайте данните за всички ученици. -[=Смесен вход/изход:=] [*(удебеления текст е изкаран от програмата, останалото е въведено от потребителя)*] +{b Смесен вход/изход:} {i (удебеления текст е изкаран от програмата, останалото е въведено от потребителя)} ``` -[=Number of students:=] 4 -[=First name:=] Ivan -[=Last name:=] Koprivan -[=Grade:=] 5.5 -[=First name:=] Dimitar -[=Last name:=] Stoianov -[=Grade:=] 3.15 -[=First name:=] Hari -[=Last name:=] Seldon -[=Grade:=] 6 -[=First name:=] Richard -[=Last name:=] Stallman -[=Grade:=] 4.53 -[=Ivan Koprivan has grade 5.5=] -[=Dimitar Stoianov has grade 3.15=] -[=Hari Seldon has grade 6=] -[=Richard Stallman has grade 4.53=] +{b Number of students:} 4 +{b First name:} Ivan +{b Last name:} Koprivan +{b Grade:} 5.5 +{b First name:} Dimitar +{b Last name:} Stoianov +{b Grade:} 3.15 +{b First name:} Hari +{b Last name:} Seldon +{b Grade:} 6 +{b First name:} Richard +{b Last name:} Stallman +{b Grade:} 4.53 +{b Ivan Koprivan has grade 5.5} +{b Dimitar Stoianov has grade 3.15} +{b Hari Seldon has grade 6} +{b Richard Stallman has grade 4.53} ## За самоподготовка -Пререшете следните задачи от УП [=без да гледате решенията=]: +Пререшете следните задачи от УП {b без да гледате решенията}: .bulleted -- [url ../../upp-2025/week13/#-21 Седмица 13, Задача 21] -- [url ../../upp-2025/week10/#-7 Седмица 10, Задача 7] -- [url ../../upp-2025/week12/#-6 Седмица 12, Задача 6] +- {url Седмица 13, Задача 21;../../upp-2025/week13/#-21} +- {url Седмица 10, Задача 7;../../upp-2025/week10/#-7} +- {url Седмица 12, Задача 6;../../upp-2025/week12/#-6} diff --git a/src/teaching/oop-2025/week01/intro.du b/src/teaching/oop-2025/week01/intro.du index 474ffb2..4b3bc6c 100644 --- a/src/teaching/oop-2025/week01/intro.du +++ b/src/teaching/oop-2025/week01/intro.du @@ -1,11 +1,11 @@ -# Уводни бележки - ООП, Седмица 1, 18.02.2026 +'def title Уводни бележки - ООП, Седмица 1, 18.02.2026 +'def desc Бележки относно практикума и курса. -'define expected-reading 1 min -'define created 17 February 2026 -'define edited 17 February 2026 -[$pagenav] +# {title} -[$presentation-controller] +{pagenav 1 min;17 February 2026;17 February 2026} + +{presentation-controller} :title_slide35 @@ -16,11 +16,11 @@ ## Уроци от УП -[$br2] +{br2} :unordered -- [=Решавайте задачи!=] +- {b Решавайте задачи!} .unordered - По УП са давани >200 задачи (да, много не бяха доизпипани) - Решения ca качвани на >150 задачи @@ -34,7 +34,7 @@ ## Относно ООП практикум -[$br3] +{br3} :unordered @@ -42,7 +42,7 @@ .unordered - Дори да не го направите, пак си идвайте -- Ще го караме по същата схема: задачи и [=решаваме=] на живо +- Ще го караме по същата схема: задачи и {b решаваме} на живо .unordered - Ако искате друго, слушам, ще го обсъдим @@ -52,13 +52,13 @@ ## Специфики на ООП в C++ -[$br1] +{br1} :unordered -- ООП не е безплатно! Дори да сте учили [`Java`]/[`C#`]/... +- ООП не е безплатно! Дори да сте учили {` Java}/{` C#}/... -- [`C++`] има много рядко-срещани обектни свойства, като: +- {` C++} има много рядко-срещани обектни свойства, като: :ordered @@ -66,7 +66,7 @@ 2. Множествено наследяване - наследяване на повече от един клас - 3. Шаблони - значително по-силни от generics ([url https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern статичен полиморфизъм], [url https://en.wikipedia.org/wiki/Template_metaprogramming#Compile-time_class_generation compile-time рекурсия], ...) + 3. Шаблони - значително по-силни от generics ({url статичен полиморфизъм;https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern}, {url compile-time рекурсия;https://en.wikipedia.org/wiki/Template_metaprogramming#Compile-time_class_generation}, ...) diff --git a/src/teaching/oop-2025/week02/index.du b/src/teaching/oop-2025/week02/index.du index f33a2fc..5b4d35f 100644 --- a/src/teaching/oop-2025/week02/index.du +++ b/src/teaching/oop-2025/week02/index.du @@ -1,25 +1,26 @@ -# Задачи - ООП, Седмица 2, 25.02.2026 +'def title Задачи - ООП, Седмица 2, 25.02.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 7 min -'define created 24 February 2026 -'define edited 28 February 2026 -[$pagenav] +# {title} + +{pagenav 7 min;24 February 2026;28 February 2026} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise01} -Реализирайте структура [`Date`], която съдържа целочислени, неотрицателни полета за ден, месец и година. +Реализирайте структура {` Date}, която съдържа целочислени, неотрицателни полета за ден, месец и година. -Реализирайте функция [`printDate`], която приема обект от тип [`Date`] и изкарва датата във формат "<ДЕН>/<МЕСЕЦ>/<ГОДИНА>", където "<МЕСЕЦ>" е краткото име на месеца (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec). +Реализирайте функция {` printDate}, която приема обект от тип {` Date} и изкарва датата във формат "<ДЕН>/<МЕСЕЦ>/<ГОДИНА>", където "<МЕСЕЦ>" е краткото име на месеца (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec). -Реализирайте функция [`readDate`], която приема от входа три целочислени числа (ден, месец, година), създава обект от тип [`Date`] и връща неговата стойност. +Реализирайте функция {` readDate}, която приема от входа три целочислени числа (ден, месец, година), създава обект от тип {` Date} и връща неговата стойност. -Използвайки [`printDate`] и [`readDate`], прочетете от входа 3 дати и изкарайте всяка от тях. +Използвайки {` printDate} и {` readDate}, прочетете от входа 3 дати и изкарайте всяка от тях. -:table_2 +:table +:2 |= Вход |= Изход @@ -27,22 +28,24 @@ |: 1/Jan/2000 30/Aug/3105 13/Jun/1909 + ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise02} -Реализирайте структура [`Temperature`], която съхранява температура по Целзии, Келвин и Фаренхайт (числа с плаваща запетая). +Реализирайте структура {` Temperature}, която съхранява температура по Целзии, Келвин и Фаренхайт (числа с плаваща запетая). -Реализирайте член-функции [`fromCelsius`], [`fromKelvin`] и [`fromFahrenheit`], където всяка обновява трите температури спрямо подадената температура. -Припомняме, че [`°F = (°C * 1.8) + 32`] и [`°K = °C + 273.15`]. +Реализирайте член-функции {` fromCelsius}, {` fromKelvin} и {` fromFahrenheit}, където всяка обновява трите температури спрямо подадената температура. +Припомняме, че {` °F = (°C * 1.8) + 32} и {` °K = °C + 273.15}. -Реализирайте член-функция [`Sum`], която приема втори обект от тип [`Temperature`] и връща обект от тип [`Temperature`], който е сумата на температурите по целзии (и съответната стойност във Фаренхайт и Келвин) на текущия и подадения обект. +Реализирайте член-функция {` Sum}, която приема втори обект от тип {` Temperature} и връща обект от тип {` Temperature}, който е сумата на температурите по целзии (и съответната стойност във Фаренхайт и Келвин) на текущия и подадения обект. -От входа получавате число с плаваща запетая (температура) и след това буква, обозначаваща типа на температурата - [`K`], [`C`] или [`F`]. +От входа получавате число с плаваща запетая (температура) и след това буква, обозначаваща типа на температурата - {` K}, {` C} или {` F}. След това получавате втора такава двойка стойности. -Изкарайте сумата на двете температури (чрез [`Sum`]) във всички температурни формати. +Изкарайте сумата на двете температури (чрез {` Sum}) във всички температурни формати. -:table_2 +:table +:2 |= Вход |= Изход @@ -53,27 +56,29 @@ |: −73.15 C -99.67 F 200 K + ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise03} -Реализирайте структура [`IntArray`], която съдържа целочислен неотрицателен размер на масив и указател към динамично-заделен масив от цели числа. +Реализирайте структура {` IntArray}, която съдържа целочислен неотрицателен размер на масив и указател към динамично-заделен масив от цели числа. Реализирайте: .bulleted -- функция [`newIntArray`], която инициализира обект от типа [`IntArray`] по подаден размер. -- член-функция [`deleteSelf`], която освобождава паметта на масива и занулява размера. -- функция [`deleteIntArray`], която използва [`deleteSelf`], за да "деинициализира" обекта. -- член-функция [`sum`], която връща сумата на всички елементи в масива. +- функция {` newIntArray}, която инициализира обект от типа {` IntArray} по подаден размер. +- член-функция {` deleteSelf}, която освобождава паметта на масива и занулява размера. +- функция {` deleteIntArray}, която използва {` deleteSelf}, за да "деинициализира" обекта. +- член-функция {` sum}, която връща сумата на всички елементи в масива. От входа получавате размер на масив от цели числа и след това толкова на брой цели числа. Изкарайте средното аритметично на елементите в масива. Възползвайте се максимално от реализираните функции! -.important [*(28.02.2026)*] Оправени примери +.important {i (28.02.2026)} Оправени примери -:table_2 +:table +:2 |= Вход |= Изход @@ -87,11 +92,12 @@ |: 5.5 + ### Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise04 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise04} -Реализирайте структура [`Product`], която съдържа целочислено неотрицателно ID, низово име и целочислена неотрицателна бройка стока. +Реализирайте структура {` Product}, която съдържа целочислено неотрицателно ID, низово име и целочислена неотрицателна бройка стока. От входа получавате бройка продукти. След това, за всеки продукт, ще получите ID и (едноредово) име. @@ -99,7 +105,7 @@ Накрая трябва да изкарате, за всеки продукт, неговото име и бройка. -[=Смесен вход/изход:=] [*(удебеления текст е изкаран от програмата, останалото е въведено от потребителя)*] +{b Смесен вход/изход:} {i (удебеления текст е изкаран от програмата, останалото е въведено от потребителя)} ``` 4 92 Apple @@ -110,30 +116,31 @@ 92 49 77 10 20 34 -[=Apple: 49=] -[=Whole Wheat Bread: 34=] -[=Apricot: 30=] -[=Natural Honey: 10=] +{b Apple: 49} +{b Whole Wheat Bread: 34} +{b Apricot: 30} +{b Natural Honey: 10} ### Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise05 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise05} -Реализирайте структура [`Package`] (пакет), която съдържа 10-буквен идентификационен код и число с плаваща запетая - тежест. -Реализирайте функция, която по подаден идентификационен код и тежест от стандартния вход, връща обект от типа [`Package`]. +Реализирайте структура {` Package} (пакет), която съдържа 10-буквен идентификационен код и число с плаваща запетая - тежест. +Реализирайте функция, която по подаден идентификационен код и тежест от стандартния вход, връща обект от типа {` Package}. -Реализирайте структура [`Warehouse`] (склад), която има еднобуквен идентификатор, динамично-заделен масив с [`Package`] обекти, бройка съхранени пакети и капацитет. +Реализирайте структура {` Warehouse} (склад), която има еднобуквен идентификатор, динамично-заделен масив с {` Package} обекти, бройка съхранени пакети и капацитет. -Реализирайте член-функция [`storePackage`], която запазва подадения пакет в текущия склад, ако има място. -Нека функцията да връща [`bool`]: [`true`] ако пакета е успешно съхранен, [`false`] иначе. +Реализирайте член-функция {` storePackage}, която запазва подадения пакет в текущия склад, ако има място. +Нека функцията да връща {` bool}: {` true} ако пакета е успешно съхранен, {` false} иначе. От входа получавате бройка складове и след това, за всеки склад, неговото еднобуквено име и капацитет. След това получавате бройка пакети и за всеки пакет, неговия идентификационен код, тежест и склад в който трябва да се добави. Накрая изкарайте, за всеки склад, неговия еднобуквен идентификатор, колко пакети са съхранени (от максималния капацитет) и след това идентификационните кодове на всички съхранени пакети. -:table_2 +:table +:2 |= Вход |= Изход @@ -162,61 +169,62 @@ KLI18M8401 F 0/20 + ## За самоподготовка ### Задача 6 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise06 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise06} -Реализирайте структура [`Time`], която съхранява целочислени неотрицателни час, минути и секунди. +Реализирайте структура {` Time}, която съхранява целочислени неотрицателни час, минути и секунди. -Реализирайте функция, която по подаден брой милисекунди от 00:00:00 часа създава обект от тип [`Time`], който съхранява съответното време. +Реализирайте функция, която по подаден брой милисекунди от 00:00:00 часа създава обект от тип {` Time}, който съхранява съответното време. Припомняме, че 1000 милисекунди са равни на 1 секунда. Закръгляйте времето надолу (тоест 999 милисекунди да съответстват на 00:00:00 часа, 1000 милисекунди на 00:00:01). -Реализирайте член-функция [`Advance`] на [`Time`], която приема обект от тип [`Time`] и добавя към текущия обект времето от подадения обект. +Реализирайте член-функция {` Advance} на {` Time}, която приема обект от тип {` Time} и добавя към текущия обект времето от подадения обект. ### Задача 7 -Реализирайте структура [`IntMatrix`], която съдържа указател към динамично-заделена матрица от числа с плаваща запетая и нейните размери. +Реализирайте структура {` IntMatrix}, която съдържа указател към динамично-заделена матрица от числа с плаваща запетая и нейните размери. -Реализирайте член-функция [`Multiply`], която приема (друга) [`IntMatrix`], прави умоножение на двете матрици (ред по стълб) и връща резултатната матрица. +Реализирайте член-функция {` Multiply}, която приема (друга) {` IntMatrix}, прави умоножение на двете матрици (ред по стълб) и връща резултатната матрица. Ако това умножение не е възможно, да върне занулена матрица (нулеви размери, нулев указател). ### Задача 8 -Реализирайте структура [`BankAccount`], която съдържа целочислен неотрицателен идентификационен код (ID) и число с плаваща запетая - баланс на сметката. +Реализирайте структура {` BankAccount}, която съдържа целочислен неотрицателен идентификационен код (ID) и число с плаваща запетая - баланс на сметката. -Към структурата реализирайте член-функции [`Withdraw`] и [`Deposit`], които съответно позволяват потребител да изтегли и депозира количество пари към сметката си. +Към структурата реализирайте член-функции {` Withdraw} и {` Deposit}, които съответно позволяват потребител да изтегли и депозира количество пари към сметката си. Имплементирайте нужните проверки (не се изтегля повече отколкото е налично, не се депозира отрицателно количество сума, так. нат.). От входа получавате буква, спрямо която трябва да се извърши някакво действие: .bulleted -- [`c`] - създава акаунт с някакво ID (програмата го избира) и нулев баланс. +- {` c} - създава акаунт с някакво ID (програмата го избира) и нулев баланс. Изкарва се на екрана ID-то на акаунта. -- [`w`] - изтегляне на сума от банкова сметка. +- {` w} - изтегляне на сума от банкова сметка. Трябва допълнително да се въведат ID и сума за теглене. При грешни стойности, да се изкара съобщение за грешка и да не се продължи с действието. -- [`d`] - депозиране на сума в банкова сметка. +- {` d} - депозиране на сума в банкова сметка. Трябва допълнително да се въведат ID и сума за теглене. При грешни стойности, да се изкара съобщение за грешка и да не се продължи с действието. -[=Смесен вход/изход:=] [*(удебеления текст е изкаран от програмата, останалото е въведено от потребителя)*] +{b Смесен вход/изход:} {i (удебеления текст е изкаран от програмата, останалото е въведено от потребителя)} ``` c -[=100=] +{b 100} d 100 500 c -[=101=] +{b 101} d 100 13.5 w 101 0.2 -[=Error: withdraw amount is larger than account balance=] +{b Error: withdraw amount is larger than account balance} w 101 -0.2 -[=Error: cannot withdraw a negative amount=] +{b Error: cannot withdraw a negative amount} d 100 -2 -[=Error: cannot deposit a negative amount=] +{b Error: cannot deposit a negative amount} diff --git a/src/teaching/oop-2025/week03/index.du b/src/teaching/oop-2025/week03/index.du index 2686623..7c0006b 100644 --- a/src/teaching/oop-2025/week03/index.du +++ b/src/teaching/oop-2025/week03/index.du @@ -1,15 +1,15 @@ -# Задачи - ООП, Седмица 3, 04.03.2026 +'def title Задачи - ООП, Седмица 3, 04.03.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 4 min -'define created 03 March 2026 -'define edited 03 March 2026 -[$pagenav] +# {title} + +{pagenav 4 min;03 March 2026;03 March 2026} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week03/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week03/Exercise01} Реализирайте система за онлайн магазин. Трябва да имате потребители, администратори и продукти. @@ -17,7 +17,7 @@ Всеки потребител (и администратор) си има потребителско име и парола. Чрез вход и изход, трябва да може потребител да се регистрира, да влезе в акаунта си и да "купи" продукти. -Администраторски акаунти, [=допълнително=], могат да променят дали акаунти са администраторски и да добавят продукти. +Администраторски акаунти, {b допълнително}, могат да променят дали акаунти са администраторски и да добавят продукти. Всеки продукт си има име, бройка и цена. Имената и пароли на потребители, както и имена на продукти не съдържат шпации. @@ -27,115 +27,115 @@ От входа първо се получава буква, която обозначава команда/действие в платформата. Когато няма "логнат" потребител, имаме следните команди налични: .bulleted -- [`l`] - влизане в потребителски акаунт, поискват се потребителско име и парола. +- {` l} - влизане в потребителски акаунт, поискват се потребителско име и парола. Ако не съвпадат на някой регистриран потребител, изкарва се съответното съобщение и процеса се анулира -- [`r`] - регистриране на потребител, поискват се потребителско име и парола. +- {` r} - регистриране на потребител, поискват се потребителско име и парола. Ако потребителско имеа се повтаря с този на вече регистриран потребител, изкарва се съответното съобщение -- [`p`] - изкарване на всички продукти и техните цени. +- {` p} - изкарване на всички продукти и техните цени. Ако няма въведени продукти, тогава да се изкара съответното съобщение. Когато потребител влезе в акаунта си, има достъп към следните команди: .bulleted -- [`p`] - изкарване на всички продукти и техните цени. +- {` p} - изкарване на всички продукти и техните цени. Ако няма въведени продукти, тогава да се изкара съответното съобщение. -- [`e`] - излизане от акаунта си -- [`b`] - купуване на продукти, първо потребителя казва колко (различни) продукта ще си купи и след това въвежда за всеки продукт, неговото име и бройка. +- {` e} - излизане от акаунта си +- {` b} - купуване на продукти, първо потребителя казва колко (различни) продукта ще си купи и след това въвежда за всеки продукт, неговото име и бройка. Ако името е грешно или няма достатъчно количество, изкарва се съответното съобщение и процеса се анулира. При успешно купуване се изкарва общата цена на продуктите и тяхната обща бройка е намалена. Когато администратор влезе в акаунта си, той има всички команди които и нормалния потребител има, заедно с: .bulleted -- [`a`] - променя дали потребител е администратор (прави администратор на нормален или нормален на администратор) -- [`s`] - въвежда име на продукт, бройка и цена. +- {` a} - променя дали потребител е администратор (прави администратор на нормален или нормален на администратор) +- {` s} - въвежда име на продукт, бройка и цена. Ако продукта не съществува, тогава го създава. Ако съществува (със същото име), тогава го обновява: бройката се добавя към текущата и ценята се заменя. -[=Смесен вход/изход:=] [*(удебеления текст е въведен от потребителя, останалото е изкарано от програмата)*] +{b Смесен вход/изход:} {i (удебеления текст е въведен от потребителя, останалото е изкарано от програмата)} ``` -[=r=] -Username: [=gg=] -Password: [=ez=] +{b r} +Username: {b gg} +Password: {b ez} Successfully registered user 'gg'! -[=l=] -Username: [=gogo=] +{b l} +Username: {b gogo} User 'gogo' does not exist! -[=l=] -Username: [=gg=] -Password: [=pie=] +{b l} +Username: {b gg} +Password: {b pie} Incorrect password! -[=l=] -Username: [=gg=] -Password: [=ez=] +{b l} +Username: {b gg} +Password: {b ez} Successful login! -[=p=] +{b p} No products! -[=s=] +{b s} No permissions! -[=e=] +{b e} Logged out! -[=l=] -Username: [=admin=] -Password: [=admin=] +{b l} +Username: {b admin} +Password: {b admin} Successful login! -[=s=] -Name: [=Apple=] -Quantity: [=50=] -Price: [=0.5=] -[=s=] -Name: [=Bread=] -Quantity: [=20=] -Price: [=1.15=] -[=s=] -Name: [=Apple=] -Quantity: [=10=] -Price: [=0.5=] -[=s=] -Name: [=Bread=] -Quantity: [=0=] -Price: [=2=] -[=p=] +{b s} +Name: {b Apple} +Quantity: {b 50} +Price: {b 0.5} +{b s} +Name: {b Bread} +Quantity: {b 20} +Price: {b 1.15} +{b s} +Name: {b Apple} +Quantity: {b 10} +Price: {b 0.5} +{b s} +Name: {b Bread} +Quantity: {b 0} +Price: {b 2} +{b p} Apple 60 0.5 Bread 20 2 -[=b=] -Number of products: [=2=] -Name: [=Apple=] -Quantity: [=100=] +{b b} +Number of products: {b 2} +Name: {b Apple} +Quantity: {b 100} Invalid quantity! -[=b=] -Number of products: [=3=] +{b b} +Number of products: {b 3} Invalid number of products! -[=b=] -Number of products: [=2=] -Name: [=Apple=] -Quantity: [=5=] -Name: [=Bread=] -Quantity: [=1=] +{b b} +Number of products: {b 2} +Name: {b Apple} +Quantity: {b 5} +Name: {b Bread} +Quantity: {b 1} Purchase successful! Total cost: 4.5 -[=p=] +{b p} Apple 55 0.5 Bread 19 2 -[=a=] -Username: [=gogo=] +{b a} +Username: {b gogo} User 'gogo' does not exist! -[=a=] -Username: [=gg=] +{b a} +Username: {b gg} Made user 'gg' into an administrator. -[=e=] +{b e} Logged out! -[=l=] -Username: [=gg=] -Password: [=ez=] +{b l} +Username: {b gg} +Password: {b ez} Successful login! -[=s=] -Name: [=Apple=] -Quantity: [=0=] -Price: [=0.75=] -[=b=] -Number of products: [=1=] -Name: [=Apple=] -Quantity: [=3=] +{b s} +Name: {b Apple} +Quantity: {b 0} +Price: {b 0.75} +{b b} +Number of products: {b 1} +Name: {b Apple} +Quantity: {b 3} Purchase successful! Total cost: 2.25 -[=p=] +{b p} Apple 52 0.75 Bread 19 2 @@ -154,102 +154,102 @@ Bread 19 2 От входа първо се получава буква, която обозначава команда/действие в платформата. Когато няма "логнат" потребител, имаме следните команди налични: .bulleted -- [`l`] - влизане в потребителски акаунт, поискват се потребителско име и парола. +- {` l} - влизане в потребителски акаунт, поискват се потребителско име и парола. Ако не съвпадат на някой регистриран потребител, изкарва се съответното съобщение и процеса се анулира -- [`r`] - регистриране на потребител, поискват се потребителско име и парола. +- {` r} - регистриране на потребител, поискват се потребителско име и парола. Ако потребителско имеа се повтаря с този на вече регистриран потребител, изкарва се съответното съобщение Когато потребител влезе в акаунта си, има достъп към следните команди: .bulleted -- [`e`] - излизане от акаунта -- [`u`] - изреждане на имената на всички регистрирани потребители (включително себе си) -- [`m`] - изпращане на съобщение, поискват се име на потребител и след това самото съобщение -- [`i`] - изкарване на съобщения, изпратени към текущо влезли потребител. +- {` e} - излизане от акаунта +- {` u} - изреждане на имената на всички регистрирани потребители (включително себе си) +- {` m} - изпращане на съобщение, поискват се име на потребител и след това самото съобщение +- {` i} - изкарване на съобщения, изпратени към текущо влезли потребител. Поисква се бройка и след това се изкарват последните толкова на брой съобщения, които са изпратени към нас. Ако се поискат повече съобщения отколкото има, тогава се изкарват всичките. -- [`h`] - изкарва се разговора между нас и даден потребител. +- {` h} - изкарва се разговора между нас и даден потребител. Поисква се име на потребител и след това се изкарват съобщенията които той е изпратил и които ние сме изпратили, в коректен ред. -[=Смесен вход/изход:=] [*(удебеления текст е въведен от потребителя, останалото е изкарано от програмата)*] +{b Смесен вход/изход:} {i (удебеления текст е въведен от потребителя, останалото е изкарано от програмата)} ``` -[=r=] -Username: [=barry=] -Password: [=1234=] +{b r} +Username: {b barry} +Password: {b 1234} Successfully registered user 'barry'! -[=r=] -Username: [=map=] -Password: [=1234=] +{b r} +Username: {b map} +Password: {b 1234} Successfully registered user 'map'! -[=r=] -Username: [=joe=] -Password: [=1234=] +{b r} +Username: {b joe} +Password: {b 1234} Successfully registered user 'joe'! -[=l=] -Username: [=map=] -Password: [=1234=] +{b l} +Username: {b map} +Password: {b 1234} Successful login! -[=u=] +{b u} barry map joe -[=m=] -Username: [=dd=] +{b m} +Username: {b dd} User 'dd' does not exist! -[=m=] -Username: [=barry=] -Message: [=Hello barry!=] -[=m=] -Username: [=barry=] -Message: [=How are you?=] -[=e=] +{b m} +Username: {b barry} +Message: {b Hello barry!} +{b m} +Username: {b barry} +Message: {b How are you?} +{b e} Logged out! -[=l=] -Username: [=joe=] -Password: [=1234=] +{b l} +Username: {b joe} +Password: {b 1234} Successful login! -[=m=] -Username: [=barry=] -Message: [=Are you there?=] -[=e=] +{b m} +Username: {b barry} +Message: {b Are you there?} +{b e} Logged out! -[=l=] -Username: [=barry=] -Password: [=1234=] +{b l} +Username: {b barry} +Password: {b 1234} Successful login! -[=m=] -Username: [=map=] -Message: [=I'm fine=] -[=i=] -Number of messages: [=10=] +{b m} +Username: {b map} +Message: {b I'm fine} +{b i} +Number of messages: {b 10} map: Hello barry! map: How are you? joe: Are you there? -[=e=] +{b e} Logged out! -[=l=] -Username: [=map=] -Password: [=1234=] +{b l} +Username: {b map} +Password: {b 1234} Successful login! -[=m=] -Username: [=barry=] -Message: [=Good to hear!=] -[=e=] +{b m} +Username: {b barry} +Message: {b Good to hear!} +{b e} Logged out! -[=l=] -Username: [=barry=] -Password: [=1234=] +{b l} +Username: {b barry} +Password: {b 1234} Successful login! -[=h=] -Username: [=map=] +{b h} +Username: {b map} map: Hello barry! map: How are you? barry: I'm fine map: Good to hear! -[=m=] -Username: [=barry=] -Message: [=Note to self: do not talk to map=] -[=i=] -Number of messages: [=3=] +{b m} +Username: {b barry} +Message: {b Note to self: do not talk to map} +{b i} +Number of messages: {b 3} joe: Are you there? map: Good to hear! barry: Note to self: do not talk to map diff --git a/src/teaching/oop-2025/week04/index.du b/src/teaching/oop-2025/week04/index.du index 67f083e..5c7e7f5 100644 --- a/src/teaching/oop-2025/week04/index.du +++ b/src/teaching/oop-2025/week04/index.du @@ -1,65 +1,65 @@ -# Задачи - ООП, Седмица 4, 11.03.2026 +'def title Задачи - ООП, Седмица 4, 11.03.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 3 min -'define created 11 March 2026 -'define edited 11 March 2026 -[$pagenav] +# {title} -.warn За всеки клас имплементирайте [=голяма четворка!=] +{pagenav 3 min;11 March 2026;11 March 2026} + +.warn За всеки клас имплементирайте {b голяма четворка!} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04/Exercise01} -Реализирайте клас [`Train`], който съдържа брой вагони, брой места за пътници, брой приети пътници, брой спирки които е минал, брой спирки които му остават, цена на билет и печалба от билети. +Реализирайте клас {` Train}, който съдържа брой вагони, брой места за пътници, брой приети пътници, брой спирки които е минал, брой спирки които му остават, цена на билет и печалба от билети. -Реализирайте селектори на всички тези параметри, конструктор с подадени стойности и публична член-функция [`ArriveAtStation`], която приема брой слизащи пътници и брой качващи се пътници. -Освен това реализирайте публична член-функция [`Print`], която изкарва всички стойности на класа. +Реализирайте селектори на всички тези параметри, конструктор с подадени стойности и публична член-функция {` ArriveAtStation}, която приема брой слизащи пътници и брой качващи се пътници. +Освен това реализирайте публична член-функция {` Print}, която изкарва всички стойности на класа. ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04/Exercise02} -Реализирайте клас [`IntArray`], който съдържа указател към масив от [`int`] елементи и капацитет. +Реализирайте клас {` IntArray}, който съдържа указател към масив от {` int} елементи и капацитет. Реализирайте публични член-функции: .unordered -- [`At`] която връща стойността по подаден индекс, -- [`Resize`] която променя размера на масива по подаден такъв. -- [`Concat`] която приема [`IntArray`] обект и слепява всички негови елементи след тези в текущия +- {` At} която връща стойността по подаден индекс, +- {` Resize} която променя размера на масива по подаден такъв. +- {` Concat} която приема {` IntArray} обект и слепява всички негови елементи след тези в текущия ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04/Exercise03} -Реализирайте клас [`String`], който съдържа низ [`char*`] и размер. +Реализирайте клас {` String}, който съдържа низ {` char*} и размер. Напомняме, че низа пак трябва да завършва на терминираща нула! Реализирайте конструктори: .unordered -- по подразбиране, в който се запазва низа [`""`] -- приемащ [`const char*`] -- приемащ [`String`] +- по подразбиране, в който се запазва низа {` ""} +- приемащ {` const char*} +- приемащ {` String} Реализирайте публични член-функции: .unordered -- селектор [`GetLength`], който връща размера на низа -- константен селектор [`GetStr`], който връща константен указател към низа -- [`Substring`] който връща нов [`String`] обект със съдържание, което е под-низ по подадените индекси -- [`Concat`] който връща нов [`String`] обект със съдържание, което е слепения (конкатениран) низ между текущия и подадения [`String`] +- селектор {` GetLength}, който връща размера на низа +- константен селектор {` GetStr}, който връща константен указател към низа +- {` Substring} който връща нов {` String} обект със съдържание, което е под-низ по подадените индекси +- {` Concat} който връща нов {` String} обект със съдържание, което е слепения (конкатениран) низ между текущия и подадения {` String} ### Задача 4 -Реализирайте клас [`Matrix`], който съдържа матрица от реални числа и нейния размер. +Реализирайте клас {` Matrix}, който съдържа матрица от реални числа и нейния размер. Реализирайте конструктор, който приема размери и масив и попълва матрицата от ляво на дясно, от горе на долу. Реализирайте член-функции: .unordered -- [`InsertRow`], която приема индекс и масив от реални числа и вмъква елементите като нов ред в матрицата -- [`InsertCol`], което приема индекс и масив от реални числа и вмъква елементите като нова колона в матрицата -- [`Sum`], която приема втора матрица и връща [`Matrix`] обект, който е сумата на текущата и подадената матрица -- [`Multiply`], която приема втора матрица и връща [`Matrix`] обект, който е умножението на текущата и подадената матрица (ред по стълб) -- [`Transpose`], която връща [`Matrix`] обект, който е транспонираната матрица на текущата +- {` InsertRow}, която приема индекс и масив от реални числа и вмъква елементите като нов ред в матрицата +- {` InsertCol}, което приема индекс и масив от реални числа и вмъква елементите като нова колона в матрицата +- {` Sum}, която приема втора матрица и връща {` Matrix} обект, който е сумата на текущата и подадената матрица +- {` Multiply}, която приема втора матрица и връща {` Matrix} обект, който е умножението на текущата и подадената матрица (ред по стълб) +- {` Transpose}, която връща {` Matrix} обект, който е транспонираната матрица на текущата 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}, която връща първо име, фамилия и имейл на всички на всички потребители, чиито сметки имат отрицателен баланс. Ще е нужно да имплементирате помощен клас. diff --git a/src/teaching/oop-2025/week06/index.du b/src/teaching/oop-2025/week06/index.du index e3cb3b3..01fcbc3 100644 --- a/src/teaching/oop-2025/week06/index.du +++ b/src/teaching/oop-2025/week06/index.du @@ -1,41 +1,41 @@ -# Задачи - ООП, Седмица 6, 25.03.2026 +'def title Задачи - ООП, Седмица 6, 25.03.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 3 min -'define created 24 March 2026 -'define edited 24 March 2026 -[$pagenav] +# {title} + +{pagenav 3 min;24 March 2026;24 March 2026} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise01.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise01.cpp} -Реализирайте програма, която създава [=текстов=] файл "HelloWorld.txt" и записва в него низа [`Hello World!`]. +Реализирайте програма, която създава {b текстов} файл "HelloWorld.txt" и записва в него низа {` Hello World!}. Уверете се че файла се създава и това е неговото съдържание. ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise02.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise02.cpp} -От входа получавате име на [=текстов=] файл. +От входа получавате име на {b текстов} файл. След това трябва да принтирате съдържанието на този файл. ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise03.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise03.cpp} Реализирайте програма, която приема на първия ред име на файл и след това текст. -Този текст може да е на няколко реда, като [=няма ограничение в дължината на редовете=]! -Знака [`@`] обозначава край на входния текст (и съответно, край на програмата). +Този текст може да е на няколко реда, като {b няма ограничение в дължината на редовете}! +Знака {` @} обозначава край на входния текст (и съответно, край на програмата). -Трябва като резултат да е създаден [=текстов=] файл с подаденото име и съдържание. +Трябва като резултат да е създаден {b текстов} файл с подаденото име и съдържание. ### Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise04.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise04.cpp} -От входа получавате име на [=текстов=] файл. +От входа получавате име на {b текстов} файл. Трябва да изкарате всички редове във файла, в обратен ред (последния ред става първи, пред-последния втори и так. нат.). .important @@ -43,60 +43,62 @@ ### Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise05.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise05.cpp} От входа получавате на един ред име на файл. -След това неотрицателно цяло число [`N`] и накрая [`N`] на брой 64-битови числа с плаваща запетая. +След това неотрицателно цяло число {` N} и накрая {` N} на брой 64-битови числа с плаваща запетая. -Трябва да запазите всички тези числа в [=двоичен=] файл с подаденото име. +Трябва да запазите всички тези числа в {b двоичен} файл с подаденото име. .question -Каква е разликата между [`<<`] и [`write`]? +Каква е разликата между {` <<} и {` write}? Кое е по-удачно тук? ### Задача 6 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise06.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise06.cpp} -От входа получавате на един ред име на [=двоичен=] файл. +От входа получавате на един ред име на {b двоичен} файл. Този файл съдържа 64-битови числа с плаваща запетая. Изкарайте на екрана всички числа от файла. Изтеглете следните файлове и проверете дали вашата програма изкарва коректен изход: -.table_2 +.table +.2 |= Файл |= Изход -|: [url ./simple.dat simple.dat] +|: {url simple.dat;./simple.dat} |: 1.1 2.2 3.3 4.4 5.5 -|: [url ./empty.dat empty.dat] -|: [*нищо, файла е празен*] -|: [url ./constants.dat constants.dat] +|: {url empty.dat;./empty.dat} +|: {i нищо, файла е празен} +|: {url constants.dat;./constants.dat} |: 2.71828 3.14159 1.61803 0.57721 ### Задача 7 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise07.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise07.cpp} -Реализирайте структура [`Smartphone`], която съдържа цяло 16-битово число за номер на версията на операционната система, неотрицателно 64-битово число за сериен номер, 32-битово число с плаваща запетая за [url https://www.gsmarena.com/glossary.php3?term=sar SAR] и буква за ревизия на хардуера, [=в този ред=]. +Реализирайте структура {` Smartphone}, която съдържа цяло 16-битово число за номер на версията на операционната система, неотрицателно 64-битово число за сериен номер, 32-битово число с плаваща запетая за {url SAR;https://www.gsmarena.com/glossary.php3?term=sar} и буква за ревизия на хардуера, {b в този ред}. -От входа получавате неотрицателно цяло число [`N`] и след това данни за [`N`] на брой смартфона. -Трябва да запишете всички тези стойности в [=двоичен=] файл. +От входа получавате неотрицателно цяло число {` N} и след това данни за {` N} на брой смартфона. +Трябва да запишете всички тези стойности в {b двоичен} файл. ### Задача 8 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise08.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise08.cpp} -Реализирайте структура [`Smartphone`] със същите полета като в предходната задача. +Реализирайте структура {` Smartphone} със същите полета като в предходната задача. -От входа получавате на един ред името на [=двоичен=] файл. +От входа получавате на един ред името на {b двоичен} файл. Трябва да изкарате на екрана (стойностите на) всички смартофони във файла. Изтеглете следните файлове и проверете дали вашата програма изкарва коректен изход: -.table_2 +.table +.2 |= Файл |= Изход -|: [url ./galaxyS26Ultra.dat galaxyS26Ultra.dat] +|: {url galaxyS26Ultra.dat;./galaxyS26Ultra.dat} |: 16 83001852 1.09 B -|: [url ./oneplus15.dat oneplus15.dat] +|: {url oneplus15.dat;./oneplus15.dat} |: 16 55929 1.17 A\n16 95200 1.17 T\n16 110999 1.08 R diff --git a/src/teaching/oop-2025/week07/index.du b/src/teaching/oop-2025/week07/index.du index 86fc97b..3314b0c 100644 --- a/src/teaching/oop-2025/week07/index.du +++ b/src/teaching/oop-2025/week07/index.du @@ -1,17 +1,17 @@ -# Задачи - ООП, Седмица 7, 01.04.2026 +'def title Задачи - ООП, Седмица 7, 01.04.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 4 min -'define created 01 April 2026 -'define edited 01 April 2026 -[$pagenav] +# {title} -.warn За всеки клас имплементирайте [=голяма петица!=] +{pagenav 4 min;01 April 2026;01 April 2026} + +.warn За всеки клас имплементирайте {b голяма петица!} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week07/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week07/Exercise01} Реализирайте система за менажиране на онлайн книги. @@ -21,9 +21,9 @@ - библиотекари, които могат да добавят и махат книги, както и да променят цената им - банкови служители, които одобряват или отказват транзакции -[=Книгите=] имат заглавие, автор, година на издаване, (многоредово) текстово съдържание и цена. +{b Книгите} имат заглавие, автор, година на издаване, (многоредово) текстово съдържание и цена. -[=Потребителите=] имат имейл и парола с които влизат, своя библиотека от книги които могат да достъпват и номер на банкова карта. +{b Потребителите} имат имейл и парола с които влизат, своя библиотека от книги които могат да достъпват и номер на банкова карта. Всеки потребител има възможността да смени своята парола или номер на банкова карта. Номер "0" на банкова карта обозначава, че няма свързана банкова карта (и потребителя може да купува само безплатни книги). @@ -35,9 +35,9 @@ Потребителите могат да виждат всички свои транзакции и техния статус: чакащ одобрение, одобрен, отхвърлен. Допълнително, могат да изкарат справка за купени книги, която е текстов файл, съдържащ всяка (одобрена) транзакция, заглавието и цената на закупената книга. -[=Библиотекарите=] имат библиотекарски номер и парола с които влизат. +{b Библиотекарите} имат библиотекарски номер и парола с които влизат. Те могат да добавят нови книги, където на един ред се въвежда заглавието на книгата, на втори се въвежда автора, на трети година на издаване, на четвърти цената и след това се въвежда съдържанието на книгата. -Това съдържание свършва, когато се въведе знака точка [`.`] на самостоятелен ред. +Това съдържание свършва, когато се въведе знака точка {` .} на самостоятелен ред. За вече съществуващи книги, могат да се редактират заглавието, автора, и цената. Да се има впредвид, че тези всички тези промени, освен върху цената, се разпространяват на потребителите. @@ -50,8 +50,8 @@ Това обозначава дали потребител може да си я купи или не (и дали излиза в списъка с налични книги за купуване; но не променя нищо ако е вече закупена). По подразбиране всяка нова книга е налична и трябва експлитно да бъде "свалена". -[=Банковите служители=] влизат със служителски номер, динамична парола и статична парола. -Статичната парола е текстова, докато динамичната парола е положително число, което трябва да изпълнява тъждеството [`(служителски_номер * динамича_парола) mod 8581 = 0`]. +{b Банковите служители} влизат със служителски номер, динамична парола и статична парола. +Статичната парола е текстова, докато динамичната парола е положително число, което трябва да изпълнява тъждеството {` (служителски_номер * динамича_парола) mod 8581 = 0}. Допълнително, нито служителския номер, нито статичната парола, могат да бъдат числата 0, 1 или 8581. Примери за такива двойки числа са: 27 17162, 572 51486, 901 42905. diff --git a/src/teaching/oop-2025/week08/index.du b/src/teaching/oop-2025/week08/index.du index a57845c..7286af7 100644 --- a/src/teaching/oop-2025/week08/index.du +++ b/src/teaching/oop-2025/week08/index.du @@ -1,26 +1,26 @@ -# Задачи - ООП, Седмица 8, 08.04.2026 +'def title Задачи - ООП, Седмица 8, 08.04.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 3 min -'define created 07 April 2026 -'define edited 08 April 2026 -[$pagenav] +# {title} + +{pagenav 3 min;07 April 2026;08 April 2026} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week08/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week08/Exercise01} .warn -За всеки клас имплементирайте [=голяма петица!=] +За всеки клас имплементирайте {b голяма петица!} Всички методи трябва да достъпни и за константни обекти, когато е възможно. Реализирайте система за менажиране на многостепенни ракети. След изтрелване на ракетата, най-долната "степен" се активира. При изразходване на горивото, тя се откача от другите степени и следващата степен се активира. -[image https://upload.wikimedia.org/wikipedia/commons/d/d6/Black_Brant.jpg]\n -[*В тази ракета, степените са оцветени по различен начин: бяло, червено и черно.*] +{img https://upload.wikimedia.org/wikipedia/commons/d/d6/Black_Brant.jpg}<br/> +{i В тази ракета, степените са оцветени по различен начин: бяло, червено и черно.} Всяка степен си има: .bulleted @@ -34,16 +34,16 @@ Може да зачитаме праволинейно ускорение и да не изчисляваме промяната на количеството гориво. Това означава, че можем да използваме следните формули за дадена степен: -[image ./img/formulas.png] +{img ./img/formulas.png} Където: .bulleted -- [`a`] е ускорението, -- [`v[_0_]`] е началната скорост, +- {` a} е ускорението, +- {` v{_ 0}} е началната скорост, за първата степен тя ще е 0, за втората тя ще е скоростта на първата степен, на третата ще е скоростта на втората степен и так. нат. -- [`x`] е разстояние в метри. +- {` x} е разстояние в метри. Степените се комбинират в ракета. Всяка ракета си има име и неограничен брой степени. @@ -56,10 +56,10 @@ - общото разстояние което ракетата може да измине, в километри - общото време в което ракетата ще гори -Допълнително, имплементирайте методи [`Export`] и [`Import`], чрез които всички данни на една ракета се запазват или вземат в/от двоичен файл. +Допълнително, имплементирайте методи {` Export} и {` Import}, чрез които всички данни на една ракета се запазват или вземат в/от двоичен файл. Неограничено количество ракети и необвързани степени се съхраняват в хангари. -Имплементирайте методи за добавяне на степени в хангара и [*преместване*] на степени в ракети. +Имплементирайте методи за добавяне на степени в хангара и {i преместване} на степени в ракети. Освен това имаме площадки от които ракети могат да се изтрелват. Всяка площадка съдържа: @@ -73,11 +73,11 @@ Реализирайте конзолен интерфейс, който поддържа командите: .bulleted -- [`exit`], която приключва програмата -- [`new_hangar`], която по подадени данни добавя нов хангар -- [`new_launch_site`], която по подадени данни добавя нова площадка -- [`new_rocket_stage`], която по подадени данни добавя нова степен в избран хангар. +- {` exit}, която приключва програмата +- {` new_hangar}, която по подадени данни добавя нов хангар +- {` new_launch_site}, която по подадени данни добавя нова площадка +- {` new_rocket_stage}, която по подадени данни добавя нова степен в избран хангар. Ако такъв не съществува, да се добави в последния добавен хангар. -- [`new_rocket`], която по подадени данни добавя нова ракета в хангар. - Степените ѝ трябва да са "пренесени" от хангар(и), [=не=] да се създадат наново. -- [`can_launch`], която по подадени данни за площадка и ракета, връща дали ракетата може да бъде изтреляна от площадката +- {` new_rocket}, която по подадени данни добавя нова ракета в хангар. + Степените ѝ трябва да са "пренесени" от хангар(и), {b не} да се създадат наново. +- {` can_launch}, която по подадени данни за площадка и ракета, връща дали ракетата може да бъде изтреляна от площадката diff --git a/src/teaching/oop-2025/week09/index.du b/src/teaching/oop-2025/week09/index.du index df7eb1e..d7bd858 100644 --- a/src/teaching/oop-2025/week09/index.du +++ b/src/teaching/oop-2025/week09/index.du @@ -1,20 +1,20 @@ -# Задачи - ООП, Седмица 9, 15.04.2026 +'def title Задачи - ООП, Седмица 9, 15.04.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 5 min -'define created 14 April 2026 -'define edited 26 April 2026 -[$pagenav] +# {title} + +{pagenav 5 min;14 April 2026;26 April 2026} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise01} .note -[*(26.04.2026)*] Променено от "дата на производство" в "година на производство" +{i (26.04.2026)} Променено от "дата на производство" в "година на производство" -Реализирайте клас [`Locomotive`], който съдържа: +Реализирайте клас {` Locomotive}, който съдържа: .bulleted - идентификационен номер - име на производител @@ -22,7 +22,7 @@ - година на производство - дължина в милиметри - брой цилиндри в двигателя -- дали поддържа връзка с втори локомотив, така че и двата да се управляват от един машинист (так. нар. [url https://en.wikipedia.org/wiki/Multiple_working multiple working]) +- дали поддържа връзка с втори локомотив, така че и двата да се управляват от един машинист (так. нар. {url multiple working;https://en.wikipedia.org/wiki/Multiple_working}) За него реализирайте нужните селектори и мутатори. @@ -40,77 +40,77 @@ Train #9999 ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise02} -Реализирайте клас [`Vector`], който съхранява неограничено количество от числа с плаваща запетая. +Реализирайте клас {` Vector}, който съхранява неограничено количество от числа с плаваща запетая. Реализирайте оператори: .bulleted -- [`+`], който покомпонентно събира елементи -- [`-`], който покомпонентно изважда елементи -- [`&`], който връща евклидовата дължина на вектора -- [`*`], който връща умножение на вектор и скалар -- [`*`], който връща точковото (покомпонентно) умножение на два вектора -- [`^`], който връща векторнотно умножение на векторите -- [`||`], който връща дали двата вектора са паралелни -- [`==`], който връща дали двата вектора са равни -- [`!=`], който връща дали двата вектора са различни +- {` +}, който покомпонентно събира елементи +- {` -}, който покомпонентно изважда елементи +- {` &}, който връща евклидовата дължина на вектора +- {` *}, който връща умножение на вектор и скалар +- {` *}, който връща точковото (покомпонентно) умножение на два вектора +- {` ^}, който връща векторнотно умножение на векторите +- {` ||}, който връща дали двата вектора са паралелни +- {` ==}, който връща дали двата вектора са равни +- {` !=}, който връща дали двата вектора са различни -За всички тези оператори реализирайте съотвените оператори за присвояване ([`+=`], [`-=`], ...). +За всички тези оператори реализирайте съотвените оператори за присвояване ({` +=}, {` -=}, ...). Ако единия вектор има повече елементи, нека те да се игнорират/оставят. ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise03} -Реализирайте клас [`String`], който съхранява низ с неограничен размер. +Реализирайте клас {` String}, който съхранява низ с неограничен размер. Имплементирайте следните оператори: .bulleted -- [`+`], конкатенира (слепва) втория низ в края на първия -- [`==`], [`!=`], [`>`], [`>=`], [`<`], [`<=`], които сравняват двата низа (както [`strcmp`] ги сравнява) -- [`[]`], който връща буква по подаден индекс -- [`[]`], който връща подниза между два индекса (вкл.), разделени със запетая. - Тоест [`text[X(3), 5]`] трябва да върне подниз с начало и край индекси 3 и 5. - [`X`] е помощен клас, наименуван по ваш начин. -- [`<<`], който връща дали левия низ завършва със съдържанието на десния низ -- [`>>`], който връща дали десния низ започва със съдържанието на левия низ +- {` +}, конкатенира (слепва) втория низ в края на първия +- {` ==}, {` !=}, {` >}, {` >=}, {` <}, {` <=}, които сравняват двата низа (както {` strcmp} ги сравнява) +- {` []}, който връща буква по подаден индекс +- {` []}, който връща подниза между два индекса (вкл.), разделени със запетая. + Тоест {` text[X(3), 5]} трябва да върне подниз с начало и край индекси 3 и 5. + {` X} е помощен клас, наименуван по ваш начин. +- {` <<}, който връща дали левия низ завършва със съдържанието на десния низ +- {` >>}, който връща дали десния низ започва със съдържанието на левия низ ### Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise04 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise04} -Реализирайте клас [`Rover`], който съхранява координатите на движещ се роувър. -В началото роувъра започва в координати [`(0,0)`] и сочи напред (към [`(0,1)`]) +Реализирайте клас {` Rover}, който съхранява координатите на движещ се роувър. +В началото роувъра започва в координати {` (0,0)} и сочи напред (към {` (0,1)}) Реализирайте следните оператори: .bulleted -- [`<`], роувъра от дясната страна на оператора се придвижва наляво с лявата страна на брой единици -- [`>`], роувъра от лявата страна на оператора се придвижва надясно с дясната страна на брой единици -- [`^`], роувъра от лявата страна на оператора се придвижва напред с дясната страна на брой единици -- [`<<`], роувъра от дясната страна на оператора се завърта обратно на часовниковата стрелка с лявата страна на брой градуси -- [`>>`], роувъра от лявата страна на оператора се завърта по часовниковата стрелка с дясната страна на брой градуси +- {` <}, роувъра от дясната страна на оператора се придвижва наляво с лявата страна на брой единици +- {` >}, роувъра от лявата страна на оператора се придвижва надясно с дясната страна на брой единици +- {` ^}, роувъра от лявата страна на оператора се придвижва напред с дясната страна на брой единици +- {` <<}, роувъра от дясната страна на оператора се завърта обратно на часовниковата стрелка с лявата страна на брой градуси +- {` >>}, роувъра от лявата страна на оператора се завърта по часовниковата стрелка с дясната страна на брой градуси Реализирайте и съответните оператори за вход/изход от/към поток. ### Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise05 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise05} -Реализирайте клас [`StringArray`], който съхранява неограничено (и оразмеряемо) количество низове. +Реализирайте клас {` StringArray}, който съхранява неограничено (и оразмеряемо) количество низове. Реализирайте нужните оператори и помощни класове, чрез които следния код е валиден: .note -[*(26.04.2026)*] +{i (26.04.2026)} Обновени конвертирания, така че примера да работи. Променени първите три размери. -```c++ +```cpp StringArray s; s[ Z(7) +++ Z(4) +++ Z(3) ] ("") (X("Hello")|"World") [ Z(4) +++ Z(5) +++ Z(1) ] ("!") [ Z(2) ] (X("Code")|"A"|"B"); -В квадратните скоби се изреждат максимални размери на очаквани низове, разделени с [`+++`]. -В кръглите скоби се подават низове, разделени с [`|`]. -Класовете [`Z`] и [`X`] са класове, наименувани по ваш начин. +В квадратните скоби се изреждат максимални размери на очаквани низове, разделени с {` +++}. +В кръглите скоби се подават низове, разделени с {` |}. +Класовете {` Z} и {` X} са класове, наименувани по ваш начин. .question Защо ни трябва експлицитното конвертиране? @@ -126,7 +126,7 @@ s[ Z(7) +++ Z(4) +++ Z(3) ] ("") (X("Hello")|"World") [ Z(4) +++ Z(5) +++ Z(1) ] - след това допълнително очакваме един низ с размер 2 - след това ни се подават три низа, с размери 4, 1 и 1 -Финално, в [`s`] трябва да имаме низовете [`"", "Hell", "Wor", "!", "Code", "A", "B"`]. +Финално, в {` s} трябва да имаме низовете {` "", "Hell", "Wor", "!", "Code", "A", "B"}. Ако ни се подаде низ с по-голям размер от очаквания, трябва да съхраним само броя знаци, които очакваме. Ако ни се подаде низ, който не очакваме, трябва да го игнорираме. diff --git a/src/teaching/oop-2025/week10/index.du b/src/teaching/oop-2025/week10/index.du index ca1825c..e99f572 100644 --- a/src/teaching/oop-2025/week10/index.du +++ b/src/teaching/oop-2025/week10/index.du @@ -1,71 +1,71 @@ -# Задачи - ООП, Седмица 10, 22.04.2026 +'def title Задачи - ООП, Седмица 10, 22.04.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 3 min -'define created 22 April 2026 -'define edited 29 April 2026 -[$pagenav] +# {title} + +{pagenav 3 min;22 April 2026;29 April 2026} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10/Exercise01} -Реализирайте клас [`User`], който съдържа полета за: +Реализирайте клас {` User}, който съдържа полета за: .bulleted - идентификационен код - име - парола - година на създаване на акаунта -И публичен метод [`LogIn`], който по подаден идентификационен код и парола връща дали данните са коректни (и потребителя може да влезе в акаунта си). +И публичен метод {` LogIn}, който по подаден идентификационен код и парола връща дали данните са коректни (и потребителя може да влезе в акаунта си). -Реализирайте наследник [`Student`] на [`User`], който допълнително съдържа полета: +Реализирайте наследник {` Student} на {` User}, който допълнително съдържа полета: .bulleted - дали е завършил или не - година на випуск -И публичен метод [`Graduate`], с който се записва че е завършил. +И публичен метод {` Graduate}, с който се записва че е завършил. -Реализирайте наследник [`Teacher`] на [`User`], който допълнително съдържа полета: +Реализирайте наследник {` Teacher} на {` User}, който допълнително съдържа полета: .bulleted - име на предмет който преподава - брой ученици на които преподава -И публичен метод [`ChangeStudents`], с който се променя бройката студенти на които преподава. +И публичен метод {` ChangeStudents}, с който се променя бройката студенти на които преподава. ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10/Exercise03} -Реализирайте клас [`Inventory`], който съдържа неограничено количество продукти. +Реализирайте клас {` Inventory}, който съдържа неограничено количество продукти. За всеки продукт съхранете име и количество. -Реализирайте наследник [`Shop`] на [`Inventory`], който допълнително съхранява неограничено количество продажби. +Реализирайте наследник {` Shop} на {` Inventory}, който допълнително съхранява неограничено количество продажби. Всяка продажба съдържа име на продукт, купено количество и дата (ден, месец, година). -Реализирайте негов метод [`Purchase`], който по подадени данни съхранява нова продажба и намалява инвентарното наличество. +Реализирайте негов метод {` Purchase}, който по подадени данни съхранява нова продажба и намалява инвентарното наличество. -Реализирайте наследник [`Warehouse`] на [`Inventory`], който допълнително съхранява неограничено количество доставки. +Реализирайте наследник {` Warehouse} на {` Inventory}, който допълнително съхранява неограничено количество доставки. Всяка доставка съдържа най-много 8 продукта, датата на доставката (ден, месец, година) и номер за проследяване. -Реализирайте негов метод [`Receive`], който по подадени данни съхранява нова доставката и увеличава инвентарното количество. +Реализирайте негов метод {` Receive}, който по подадени данни съхранява нова доставката и увеличава инвентарното количество. .warn Всички неограничени количества трябва да са имплементирани в самия клас. -Не може да имплементирате [`ProductArray`], който да е член-данна в [`Inventory`] например. +Не може да имплементирате {` ProductArray}, който да е член-данна в {` Inventory} например. ## За любознателните ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10/Exercise02} .warn -[*(29.04.2026)*] +{i (29.04.2026)} Тази задача избързва с материала, затова е преместена тук. -Реализирайте клас [`Vehicle`], който съдържа полета за: +Реализирайте клас {` Vehicle}, който съдържа полета за: .bulleted - модел - година на производство @@ -74,21 +74,20 @@ - тежест в килограми - конски сили -Реализирайте наследник [`CombustionVehicle`] на [`Vehicle`], който съдържа полета за: +Реализирайте наследник {` CombustionVehicle} на {` Vehicle}, който съдържа полета за: .bulleted - брой цилиндри в двигателя - обем на двигателя в литри -Реализирайте наследник [`ElectricVehicle`] на [`Vehicle`], който съдържа полета за: +Реализирайте наследник {` ElectricVehicle} на {` Vehicle}, който съдържа полета за: .bulleted - капацитет на батерия в киловатчаса - пробег в километри - количество поддържано захранване в киловатове -За всички класове реализирайте нужните селектори и мутатори, както и [`operator<<`] и [`operator>>`]. +За всички класове реализирайте нужните селектори и мутатори, както и {` operator<<} и {` operator>>}. От входа получавате цяло неотрицателно число: бройка превозни средства. -След това, за всяко превозно средство получавате буква определяща типа му ([`c`] за [`CombustionVehicle`] и [`e`] за [`ElectricVehicle`]) и след това всички нужни стойности (първо тези от [`Vehicle`], модел, година на производство, ... и след това тези за съответния автомобил). - -Запазете всички превозни средства в [=един=] масив. +След това, за всяко превозно средство получавате буква определяща типа му ({` c} за {` CombustionVehicle} и {` e} за {` ElectricVehicle}) и след това всички нужни стойности (първо тези от {` Vehicle}, модел, година на производство, ... и след това тези за съответния автомобил). +Запазете всички превозни средства в {b един} масив. diff --git a/src/teaching/oop-2025/week11/index.du b/src/teaching/oop-2025/week11/index.du index 7acd8cd..ac154b6 100644 --- a/src/teaching/oop-2025/week11/index.du +++ b/src/teaching/oop-2025/week11/index.du @@ -1,63 +1,63 @@ -# Задачи - ООП, Седмица 11, 29.04.2026 +'def title Задачи - ООП, Седмица 11, 29.04.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 4 min -'define created 28 April 2026 -'define edited 29 April 2026 -[$pagenav] +# {title} + +{pagenav 4 min;28 April 2026;29 April 2026} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise01} -Реализирайте шаблонен клас [`Pair`], който пази две стойности от типове [`T`] и [`U`]. +Реализирайте шаблонен клас {` Pair}, който пази две стойности от типове {` T} и {` U}. Реализирайте съотвените мутатори и селектори за константни и неконстантни обекти. ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise02} -Реализирайте шаблонен клас [`Option`], който съхранява стойност от тип [`T`]. +Реализирайте шаблонен клас {` Option}, който съхранява стойност от тип {` T}. -Нека конструкторите да [=не=] са публични. -За създаване на обект, имплементирайте статични методи [`Some`] и [`None`], първия от които приема стойност, а втория не приема нищо. +Нека конструкторите да {b не} са публични. +За създаване на обект, имплементирайте статични методи {` Some} и {` None}, първия от които приема стойност, а втория не приема нищо. -Целта е следната: ако един [`Option`] е създаден чрез [`None`], тогава обозначаваме че няма стойност, а чрез [`Some`] показваме че има стойност. -Идеята е аналогична на това когато един указател е [`nullptr`] или не, но работи в по-общи случаи. +Целта е следната: ако един {` Option} е създаден чрез {` None}, тогава обозначаваме че няма стойност, а чрез {` Some} показваме че има стойност. +Идеята е аналогична на това когато един указател е {` nullptr} или не, но работи в по-общи случаи. Имплементирайте методи: .bulleted -- [`IsSome`], връща дали има стойност -- [`IsNone`], връща дали няма стойност -- [`Unwrap`], връща запазената стойност +- {` IsSome}, връща дали има стойност +- {` IsNone}, връща дали няма стойност +- {` Unwrap}, връща запазената стойност ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise03} -Реализирайте шаблонен клас [`SharedPointer`], който пази динамично-заделен указател към тип [`T`]. -Допълнително, класа следи за бройката свои [*инстанции*]. +Реализирайте шаблонен клас {` SharedPointer}, който пази динамично-заделен указател към тип {` T}. +Допълнително, класа следи за бройката свои {i инстанции}. С други думи, при всяко копиране на създадения обект, увеличаваме бройката, и при всяко унищожаване (извикване на деструктор) намаляваме бройката. Изтриването на паметта (указателя) се случва тогава, и само тогава когато бройката стигне нула. .note -Това е вид [url https://en.wikipedia.org/wiki/Smart_pointer "smart pointer"]: динамично-заделен указател който сам освобождава паметта си, без ние да пишем експлицитен [`delete`]!\n -В C++ има и други видове smart pointer-и, като "unique pointer" (който е описан в [url #-6 Задача 6]). +Това е вид {url "smart pointer";https://en.wikipedia.org/wiki/Smart_pointer}: динамично-заделен указател който сам освобождава паметта си, без ние да пишем експлицитен {` delete}!\n +В C++ има и други видове smart pointer-и, като "unique pointer" (който е описан в {url Задача 6;#-6}). -Добър въведителен ресурс по темата е [url https://courses.cs.washington.edu/courses/cse333/24au/lectures/16-c++-smartptr.pdf този]. +Добър въведителен ресурс по темата е {url този;https://courses.cs.washington.edu/courses/cse333/24au/lectures/16-c++-smartptr.pdf}. -Реализирайте [`operator*`] и [`operator->`], които съответстват на операциите върху запазения указател. -Тоест, [`*x`] трябва да има един и същ ефект върху [`int*`] и върху [`SharedPointer`] от [`int*`]. +Реализирайте {` operator*} и {` operator->}, които съответстват на операциите върху запазения указател. +Тоест, {` *x} трябва да има един и същ ефект върху {` int*} и върху {` SharedPointer} от {` int*}. .question -Как работи [`operator->`]? +Как работи {` operator->}? -Имплементирайте също метод [`RefCount`], който връща броя копия. +Имплементирайте също метод {` RefCount}, който връща броя копия. Примерна употреба: -```c++ +```cpp void inc(SharedPointer<int> val) { // val е копие на y, бройката е 3 *val++; } // val се унищожава, бройката става 2 @@ -72,36 +72,36 @@ int main() { ### Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise04 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise04} -Реализирайте шаблонен клас [`Vector`], който съхранява неограничено и оразмеряемо количество от обекти [`T`]. +Реализирайте шаблонен клас {` Vector}, който съхранява неограничено и оразмеряемо количество от обекти {` T}. Освен голяма петица, реализирайте член-функции: .bulleted -- [`Count`], която връща броя елементи -- [`PushBack`], която добавя елемент в края на последователността. +- {` Count}, която връща броя елементи +- {` PushBack}, която добавя елемент в края на последователността. Ако е нужно, уголемява заделеното количество памет. -- [`operator[]`], който връща референция към обекта на подаден индекс. +- {` operator[]}, който връща референция към обекта на подаден индекс. Да бъде наличен при константни и не-константни обекти. -- [`operator+`] който създава нов [`Vector`] с елементите от първия и след това елементите от втория [`Vector`] -- [`operator+=`], които добавя елементите на десния [`Vector`] в края на левия +- {` operator+} който създава нов {` Vector} с елементите от първия и след това елементите от втория {` Vector} +- {` operator+=}, които добавя елементите на десния {` Vector} в края на левия ## За самоподготовка ### Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise05 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise05} -Реализирайте клас [`DoubleVector`], който съхранява две неограничени и оразмеряеми количества от обекти, съответно от типове [`T`] и [`U`]. +Реализирайте клас {` DoubleVector}, който съхранява две неограничени и оразмеряеми количества от обекти, съответно от типове {` T} и {` U}. -Имплементирайте голяма петица и член-функциите от [url #-4 Задача 4], обаче всяка трябва да е налична и за двете последователности от обекти. +Имплементирайте голяма петица и член-функциите от {url Задача 4;#-4}, обаче всяка трябва да е налична и за двете последователности от обекти. ### Задача 6 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise06 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise06} -Реализирайте шаблонен клас [`UniquePointer`], който пази указател към тип [`T`]. +Реализирайте шаблонен клас {` UniquePointer}, който пази указател към тип {` T}. Класа трябва да осигури, че само един обект има този указател. -С други думи, [=не може да има копия=]! +С други думи, {b не може да има копия}! -Реализирайте [`operator*`] и [`operator->`], които съответстват на операциите върху запазения указател (т.е. [`*x`] трябва да има същия ефект, без значение дали работим с [`int*`] или [`SharedPointer`], който съхранява [`int*`]). +Реализирайте {` operator*} и {` operator->}, които съответстват на операциите върху запазения указател (т.е. {` *x} трябва да има същия ефект, без значение дали работим с {` int*} или {` SharedPointer}, който съхранява {` int*}). diff --git a/src/teaching/oop-2025/week12/index.du b/src/teaching/oop-2025/week12/index.du index 4f34d9c..243ee93 100644 --- a/src/teaching/oop-2025/week12/index.du +++ b/src/teaching/oop-2025/week12/index.du @@ -1,9 +1,9 @@ -# Задачи - ООП, Седмица 12, 13.05.2026 +'def title Задачи - ООП, Седмица 12, 13.05.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 2 min -'define created 13 May 2026 -'define edited 13 May 2026 -[$pagenav] +# {title} + +{pagenav 2 min;13 May 2026;13 May 2026} ## За решаване diff --git a/src/teaching/oop-2025/week13/index.du b/src/teaching/oop-2025/week13/index.du index 77479ed..5ea3f64 100644 --- a/src/teaching/oop-2025/week13/index.du +++ b/src/teaching/oop-2025/week13/index.du @@ -1,66 +1,66 @@ -# Задачи - ООП, Седмица 13, 20.05.2026 +'def title Задачи - ООП, Седмица 13, 20.05.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 3 min -'define created 20 May 2026 -'define edited 20 May 2026 -[$pagenav] +# {title} + +{pagenav 3 min;20 May 2026;20 May 2026} ## За решаване ### Задача 1 -Реализирайте абстрактен клас [`Numeric`], който съдържа чисто виртуални функции: +Реализирайте абстрактен клас {` Numeric}, който съдържа чисто виртуални функции: .bulleted -- [`operator+`] -- унарен [`operator-`] -- бинарен [`operator-`] -- [`operator+=`] -- [`operator-=`] +- {` operator+} +- унарен {` operator-} +- бинарен {` operator-} +- {` operator+=} +- {` operator-=} -Реализирайте негови наследници [`Integer`] и [`Float`], които съответно имплементират операции върху [`int`] и [`float`] стойности. +Реализирайте негови наследници {` Integer} и {` Float}, които съответно имплементират операции върху {` int} и {` float} стойности. ### Задача 2 -Реализирайте клас [`User`], който съхранява идентификационен номер и входен ПИН код. -Имплементирайте (виртуална) член-функция [`LogIn`], която връща дали подадения ѝ ПИН код съответства на запазения. +Реализирайте клас {` User}, който съхранява идентификационен номер и входен ПИН код. +Имплементирайте (виртуална) член-функция {` LogIn}, която връща дали подадения ѝ ПИН код съответства на запазения. -Реализирайте наследник [`Citizen`], който разширява функцията [`LogIn`], така че винаги да отказва числа, които имат повече от 4 цифри. +Реализирайте наследник {` Citizen}, който разширява функцията {` LogIn}, така че винаги да отказва числа, които имат повече от 4 цифри. -Реализирайте наследник (на [`User`]) [`Clerk`], който допълнително съхранява статичен код. -[`LogIn`] в този случай е успешен, когато [`((ВХОДЕН_ПИН + СЪХРАНЕН_ПИН) * СТАТИЧЕН_КОД) % 115249 = 347`]. +Реализирайте наследник (на {` User}) {` Clerk}, който допълнително съхранява статичен код. +{` LogIn} в този случай е успешен, когато {` ((ВХОДЕН_ПИН + СЪХРАНЕН_ПИН) * СТАТИЧЕН_КОД) % 115249 = 347}. Пример за валидни стойности са 700 за съхранен пин, 3141 за входен пин и 47978 за статичен код. -Реализирайте наследник (на [`User`]) [`System`], при който [`LogIn`] е валидно, когато подадения пин е точен квадрат на съхранения пин. +Реализирайте наследник (на {` User}) {` System}, при който {` LogIn} е валидно, когато подадения пин е точен квадрат на съхранения пин. -От входа получавате неотрицателно цяло число [`N`] и след това данни за [`N`] на брой потребителя. -При всеки потребител се поисква буква, определяща неговия тип: [`c`] за [`Citizen`], [`l`] за [`Clerk`] и [`s`] за [`System`]. -Трябва да съхраните всички потребители в [=полиморфен=] масив с елементи от тип [`User*`]. +От входа получавате неотрицателно цяло число {` N} и след това данни за {` N} на брой потребителя. +При всеки потребител се поисква буква, определяща неговия тип: {` c} за {` Citizen}, {` l} за {` Clerk} и {` s} за {` System}. +Трябва да съхраните всички потребители в {b полиморфен} масив с елементи от тип {` User*}. След това от входа ще получавате идентификационен номер и пин код, и трябва да върнете дали подадените данни са валидни за влизане в акаунта. ### Задача 3 -Реализирайте клас [`String`], който съхранява динамично-задлен низ. +Реализирайте клас {` String}, който съхранява динамично-задлен низ. Освен голяма петица, имплементирайте виртуален мутатор и константен селектор към низа. -Реализирайте клас [`Username`], наследник на [`String`], чиито мутатор приема единствено низове, които съдържат само главни и малки латински букви. +Реализирайте клас {` Username}, наследник на {` String}, чиито мутатор приема единствено низове, които съдържат само главни и малки латински букви. -Реализирайте клас [`Match`], наследник на [`String`], който съхранява допълнителен динамично-заделен низ [`pattern`] и бройка [`matches`]. -За [`pattern`] има друг селектор и мутатор. -При всяка промяна на [`pattern`] и оригиналния низ, [`matches`] се обновява с бройката (потенциално препокриващи се) срещания на [`pattern`] в низа. +Реализирайте клас {` Match}, наследник на {` String}, който съхранява допълнителен динамично-заделен низ {` pattern} и бройка {` matches}. +За {` pattern} има друг селектор и мутатор. +При всяка промяна на {` pattern} и оригиналния низ, {` matches} се обновява с бройката (потенциално препокриващи се) срещания на {` pattern} в низа. ### Задача 4 -Реализирайте шаблонен клас [`Indexable`], който съхранява чисто-виртуален не-константен [`operator[]`], и имплементира константен [`operator[]`], базиран на не-константния. +Реализирайте шаблонен клас {` Indexable}, който съхранява чисто-виртуален не-константен {` operator[]}, и имплементира константен {` operator[]}, базиран на не-константния. -Реализирайте клас [`Compareable`], който съхранява чисто-виртуални [`operator<`] и [`operator==`], и имплементира останалите оператори за сравнение ([`<=`], [`>`], [`>=`], [`!=`]), използвайки чисто-виртуалните. +Реализирайте клас {` Compareable}, който съхранява чисто-виртуални {` operator<} и {` operator==}, и имплементира останалите оператори за сравнение ({` <=}, {` >}, {` >=}, {` !=}), използвайки чисто-виртуалните. -Реализирайте клас [`Dynamic`], който въхранява чисто-виртуални не-публични методи [`free`], [`copyFrom`] и [`init`], и имплементира компонентите от голямата петица, използвайки тези методи. +Реализирайте клас {` Dynamic}, който въхранява чисто-виртуални не-публични методи {` free}, {` copyFrom} и {` init}, и имплементира компонентите от голямата петица, използвайки тези методи. -Реализирайте клас [`Vector`], който съхранява динамично-заделен масив от елементи и е наследник и на трите класа. +Реализирайте клас {` Vector}, който съхранява динамично-заделен масив от елементи и е наследник и на трите класа. Сравненията между вектори са спрямо бройката елементи. -Реализирайте клас [`Integer`], който съхранява динамично-заделен [`int`] и наследява [`Compareable`] и [`Dynamic`]. +Реализирайте клас {` Integer}, който съхранява динамично-заделен {` int} и наследява {` Compareable} и {` Dynamic}. -Реализирайте шаблонен клас [`Array`], който съхранява статично-заделен масив, чиито елементи и тяхна бройка се подават като част от типа, и който наследява [`Indexable`] и [`Compareable`]. +Реализирайте шаблонен клас {` Array}, който съхранява статично-заделен масив, чиито елементи и тяхна бройка се подават като част от типа, и който наследява {` Indexable} и {` Compareable}. Сравненията между масиви са спрямо бройката елементи. diff --git a/src/teaching/oop-2025/week14/index.du b/src/teaching/oop-2025/week14/index.du index c01f3b8..bcf8220 100644 --- a/src/teaching/oop-2025/week14/index.du +++ b/src/teaching/oop-2025/week14/index.du @@ -1,27 +1,27 @@ -# Задачи - ООП, Седмица 14, 27.05.2026 +'def title Задачи - ООП, Седмица 14, 27.05.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 2 min -'define created 27 May 2026 -'define edited 27 May 2026 -[$pagenav] +# {title} + +{pagenav 2 min;27 May 2026;27 May 2026} ## За решаване ### Задача -Реализирайте клас [`Sensor`], който съхранява целочислен неотрицателен сериен номер и число с плаваща запетая за напрежение на захранване. +Реализирайте клас {` Sensor}, който съхранява целочислен неотрицателен сериен номер и число с плаваща запетая за напрежение на захранване. Също имплементирайте методи, налични във всички наследници: .bulleted -- [`GetType`], който връща типа на сензора (най-десните 2 цифри от серийния номер). -- [`EnoughSupply`], който приема напрежение, което се подава на сензора и връща дали е достатъчно или не +- {` GetType}, който връща типа на сензора (най-десните 2 цифри от серийния номер). +- {` EnoughSupply}, който приема напрежение, което се подава на сензора и връща дали е достатъчно или не -Реализирайте негови наследници [`CameraSensor`] и [`GyroSensor`]. +Реализирайте негови наследници {` CameraSensor} и {` GyroSensor}. -[`CameraSensor`] съхранява резолюция (височина и ширина) и брой взети снимки. -При класа имплементирайте метод [`TakeSnapshot`], който инкрементира бройката взети снимки. +{` CameraSensor} съхранява резолюция (височина и ширина) и брой взети снимки. +При класа имплементирайте метод {` TakeSnapshot}, който инкрементира бройката взети снимки. -[`GyroSensor`] съхранява скорост на измерване в [`dps`] (ъгли в секунда). -Имплементирайте негов метод [`Rotate`], който по получен ъгъл връща най-малкото количество от време, което е нужно за да може сензора да измере въртенето. +{` GyroSensor} съхранява скорост на измерване в {` dps} (ъгли в секунда). +Имплементирайте негов метод {` Rotate}, който по получен ъгъл връща най-малкото количество от време, което е нужно за да може сензора да измере въртенето. -Реализирайте наследник [`DSLR`] на [`CameraSensor`] и [`GyroSensor`], който допълнително съхранява изходна резолюция (височина и ширина) и скорост на вземане на кадър. -Имплементирайте член-функция [`CorrectedCapture`], която по подаден ъгъл, прави снимка и връща колко кадъра ще отнемат докато въртенето е напълно измерено. +Реализирайте наследник {` DSLR} на {` CameraSensor} и {` GyroSensor}, който допълнително съхранява изходна резолюция (височина и ширина) и скорост на вземане на кадър. +Имплементирайте член-функция {` CorrectedCapture}, която по подаден ъгъл, прави снимка и връща колко кадъра ще отнемат докато въртенето е напълно измерено. diff --git a/src/teaching/oop-2025/week15/index.du b/src/teaching/oop-2025/week15/index.du index 09e7a90..eececaa 100644 --- a/src/teaching/oop-2025/week15/index.du +++ b/src/teaching/oop-2025/week15/index.du @@ -1,9 +1,9 @@ -# Задачи - ООП, Седмица 15, 03.06.2026 +'def title Задачи - ООП, Седмица 15, 03.06.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 3 min -'define created 03 June 2026 -'define edited 03 June 2026 -[$pagenav] +# {title} + +{pagenav 3 min;03 June 2026;03 June 2026} ## За решаване @@ -11,35 +11,35 @@ Ще създадем система за създаване на постове от потребители, нещо подобно на Facebook/Reddit/... -Реализирайте шаблонен клас [`Database`], който съхранява неограничено количество от обекти от тип [`T`] с идентификатор от тип [`K`]. -На всеки обект може да съответства един [*уникален*] идентификатор. -За тип [`K`] можем да допуснем единствено, че поддържа [`operator==`]. +Реализирайте шаблонен клас {` Database}, който съхранява неограничено количество от обекти от тип {` T} с идентификатор от тип {` K}. +На всеки обект може да съответства един {i уникален} идентификатор. +За тип {` K} можем да допуснем единствено, че поддържа {` operator==}. -В [`Database`] трябва да може да се добавят и премахват елементи, спрямо даден идентификатор. -Нека тези член-функции да връщат [`bool`], спрямо това дали операцията е успешна. +В {` Database} трябва да може да се добавят и премахват елементи, спрямо даден идентификатор. +Нека тези член-функции да връщат {` bool}, спрямо това дали операцията е успешна. -Реализирайте клас [`User`], който въхранява имейл, потребителско име и парола. +Реализирайте клас {` User}, който въхранява имейл, потребителско име и парола. .bulleted -- Имейла трябва да е в [url https://en.wikipedia.org/wiki/Email_address#Syntax коректен формат] (не е нужно 100% покритие на всички изисквания, но поне по-значимите ограничения да се проверяват). +- Имейла трябва да е в {url коректен формат;https://en.wikipedia.org/wiki/Email_address#Syntax} (не е нужно 100% покритие на всички изисквания, но поне по-значимите ограничения да се проверяват). - Потребителското име може да съдържа латински бувки, цифри, тире и долна черта, като не може да започва с тире или цифра. - Паролата трябва да бъде поне 8 знака и да съдържа поне една цифра, една буква и един специален знак (нито цифра, нито буква) -Реализирайте клас [`Post`], който съхранява идентификатор на потребител (какъв е типа на този идентификатор ще бъде описано по-късно), текстово съдържание с неограничен размер и контейнер с идентификатори на всички потребители, които са харесали поста. +Реализирайте клас {` Post}, който съхранява идентификатор на потребител (какъв е типа на този идентификатор ще бъде описано по-късно), текстово съдържание с неограничен размер и контейнер с идентификатори на всички потребители, които са харесали поста. -Реализирайте клас [`PostSystem`], който съхранява колекции от потребители и постове (използвайки [`Database`]), като е шаблонен спрямо типа на идентификатора на потребителя. +Реализирайте клас {` PostSystem}, който съхранява колекции от потребители и постове (използвайки {` Database}), като е шаблонен спрямо типа на идентификатора на потребителя. Трябва да поддържа методи за регистриране на нов потребител, изтриване на акаунт, влизане в акаунт и излизане от акаунт. -При влизане в акаунт, системата връща "токен" от тип [`A`], който се използва за всички операции, където е нужна информация на съществуващ потребител. -Разбира се, всеки токен се пази в [`PostSystem`] и при потребителска операция се прави сравнение дали токена съответства на потребителя. +При влизане в акаунт, системата връща "токен" от тип {` A}, който се използва за всички операции, където е нужна информация на съществуващ потребител. +Разбира се, всеки токен се пази в {` PostSystem} и при потребителска операция се прави сравнение дали токена съответства на потребителя. При влизане в акаунт се проверява дали генерирания токен съществува, и ако да, тогава влизането се отказва. -За тип [`A`] единствено можем да допуснем, че поддържа [`operator==`]. +За тип {` A} единствено можем да допуснем, че поддържа {` operator==}. Понеже не знаем типа и следователно не знаем как да се генерира токена, член-функцията за генериране не може да има реализация. Освен тези операции, влязъл потребител може да създаде пост, да изтрие пост и да маркира/отмаркира пост като харесан. -Реализирайте наследник [`SecureForum`], където потребителските идентификатори и токени са целочислени неотрицателни поне 16-битови числа. +Реализирайте наследник {` SecureForum}, където потребителските идентификатори и токени са целочислени неотрицателни поне 16-битови числа. Всеки потребител си има единствен токен след влизане в акаунта (т.е. може да влезе в акаунта само ако е излязъл). -Реализирайте наследник [`StandardForum`], където потребителския идентификатор е целочислено неотрицателно число и токена е низ. +Реализирайте наследник {` StandardForum}, където потребителския идентификатор е целочислено неотрицателно число и токена е низ. Има неограничено количество токени за всеки потребител |