diff options
1 files changed, 41 insertions, 41 deletions
| -rw-r--r-- | src/teaching/oop-2025/week11/index.du | 82 |
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*}). |