diff options
1 files changed, 62 insertions, 59 deletions
| -rw-r--r-- | src/teaching/oop-2023/week11/index.du | 121 |
diff --git a/src/teaching/oop-2023/week11/index.du b/src/teaching/oop-2023/week11/index.du index 295c2de..661a24f 100644 --- a/src/teaching/oop-2023/week11/index.du +++ b/src/teaching/oop-2023/week11/index.du @@ -1,165 +1,168 @@ -# Задачи - ООП, Седмица 11, 09.05.2024 +'def title Задачи - ООП, Седмица 11, 09.05.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/oYQehcnN classroom.github.com/a/oYQehcnN] +GitHub classroom: {url classroom.github.com/a/oYQehcnN;https://classroom.github.com/a/oYQehcnN} ## Преговорни .warn Моля, не отделяйте на преговорните задачи повече от 30мин -.important Всеки бащин клас, във всички случаи, трябва да има виртуален деструктор ([`virtual ~ClassName();`]). +.important Всеки бащин клас, във всички случаи, трябва да има виртуален деструктор ({` virtual ~ClassName()\;}). ### Задача 1 - Шаблони и оператори -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise01} Реализирайте шаблонен клас множество, който запазва фиксиран брой елементи от подаден тип. Реализирайте голяма петица и оператори: .bulleted -- [`+`], [`+=`] които действат като обединение -- [`*`], [`*=`] които действат като сечение -- [`-`], [`-=`] които действат като допълнение +- {` +}, {` +=} които действат като обединение +- {` *}, {` *=} които действат като сечение +- {` -}, {` -=} които действат като допълнение ### Задача 2 - Наследяване -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise02} -Реализирайте клас [`Employee`], съхраняващ име на човек, позиция и департамент като низове със съответно дължина 512, 128 и 64, заедно със заплата като число с плаваща запетая. +Реализирайте клас {` Employee}, съхраняващ име на човек, позиция и департамент като низове със съответно дължина 512, 128 и 64, заедно със заплата като число с плаваща запетая. -Реализирайте негов наследник [`Manager`], който допълнително пази масив с фиксиран размер от Employee. +Реализирайте негов наследник {` Manager}, който допълнително пази масив с фиксиран размер от Employee. -Реализирайте наследника на [`Employee`], [`Developer`], който допълнително пази брой проекти върху който работи. +Реализирайте наследника на {` Employee}, {` Developer}, който допълнително пази брой проекти върху който работи. -Наследниците не могат да достъпят заплатата, но трябва да могат да достъпят другите данни на [`Employee`]. +Наследниците не могат да достъпят заплатата, но трябва да могат да достъпят другите данни на {` Employee}. ## Лесни ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise03} .comment Динамично свързване, Inherit 3 -Реализирайте клас [`Electronics`], който съдържа модел (низ с максимална дължина от 255 знака), [`needsVolts`] и [`needsAmps`] (стойности с плаваща запетая). +Реализирайте клас {` Electronics}, който съдържа модел (низ с максимална дължина от 255 знака), {` needsVolts} и {` needsAmps} (стойности с плаваща запетая). Имплементирайте негови наследници: .bulleted -- [`Laptop`], който допълнително съхранява размер на екрана като число с плаваща запетая -- [`WashingMachine`], който допълнително запазва максимално тегло на прането, като цяло неотрицателно число -- [`Camera`], която допълнително запазва резолюция като число с плаваща запетая (в мегапиксели) +- {` Laptop}, който допълнително съхранява размер на екрана като число с плаваща запетая +- {` WashingMachine}, който допълнително запазва максимално тегло на прането, като цяло неотрицателно число +- {` Camera}, която допълнително запазва резолюция като число с плаваща запетая (в мегапиксели) -За всеки клас реализирайте член-функция [`Print`], която изкарва всички данни на екрана. +За всеки клас реализирайте член-функция {` Print}, която изкарва всички данни на екрана. -&:question Чрез статично или динамично свързване сте имплементирали [`Print`]? Каква е разликата? +&:question Чрез статично или динамично свързване сте имплементирали {` Print}? Каква е разликата? ### Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise04 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise04} .comment Dynamic linking, Inherit 2 -Реализирайте клас [`String`], който запазва динамично-заделен масив. +Реализирайте клас {` String}, който запазва динамично-заделен масив. -Имплементирайте негов наследник [`Name`], който допълнително запазва число: номер на името (първо име, бащино име (второ име), фамилия (трето име)). +Имплементирайте негов наследник {` Name}, който допълнително запазва число: номер на името (първо име, бащино име (второ име), фамилия (трето име)). -Имплементирайте втори наследник на [`String`], [`Street`], който запазва и число: номер на улицата. +Имплементирайте втори наследник на {` String}, {` Street}, който запазва и число: номер на улицата. -Във всеки клас имплементирайте голяма петица, член-функция [`Length`], като: +Във всеки клас имплементирайте голяма петица, член-функция {` Length}, като: .bulleted -- в [`String`] връща дължината на низа, -- в [`Name`] връща дължината на името умножена по номера си и -- в [`Street`] връща дължината на името на улицата плюс броя цифри в номера на улицата. +- в {` String} връща дължината на низа, +- в {` Name} връща дължината на името умножена по номера си и +- в {` Street} връща дължината на името на улицата плюс броя цифри в номера на улицата. -Самият низ в [`String`] [=не=] може да се достъпва от наследниците. +Самият низ в {` String} {b не} може да се достъпва от наследниците. ### Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise05 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise05} .comment Templates 1 type -Реализирайте шаблонен клас [`Counted`], който запазва елемент от подаден тип и неговата бройка (цяло неотрицателно число). -Имплементирайте оператори [`++`], [`--`], [`+=`], [`-=`], които променят бройката, както и гетъри за елемента и бройката. +Реализирайте шаблонен клас {` Counted}, който запазва елемент от подаден тип и неговата бройка (цяло неотрицателно число). +Имплементирайте оператори {` ++}, {` --}, {` +=}, {` -=}, които променят бройката, както и гетъри за елемента и бройката. ### Задача 6 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise06 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise06} .comment Templates 2 types -Реализирайте шаблонен клас [`TwoArray`], който запазва два динамично-заделени масива с подадени типове. +Реализирайте шаблонен клас {` TwoArray}, който запазва два динамично-заделени масива с подадени типове. Масивите не могат да се оразмеряват и имат еднаква дължина. Имплементирайте: .bulleted - голяма петица, -- оператор [`[]`], който по подаден индекс връща елемент от първия масив, и -- оператор [`()`], който по подаден индекс връща елемент от втория масив. +- оператор {` []}, който по подаден индекс връща елемент от първия масив, и +- оператор {` ()}, който по подаден индекс връща елемент от втория масив. ### Задача 7 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise07 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise07} .comment Abstract class -Реализирайте абстрактен клас [`DynamicArray`], който задължава наследниците да имплементират оператор [`[]`] и оператор [`+=`]. +Реализирайте абстрактен клас {` DynamicArray}, който задължава наследниците да имплементират оператор {` []} и оператор {` +=}. Реализирайте негови наследници: :unordered -- [`Numbers`], който "имплементира" динамично-заделен масив от цели числа, като +- {` Numbers}, който "имплементира" динамично-заделен масив от цели числа, като .bulleted - - оператор [`[]`] връща първия елемент, по-малък от подадения индекс. Ако няма такъв, връщате първия елемент. - - оператор [`+=`] вмъква елементите в началото на масива + - оператор {` []} връща първия елемент, по-малък от подадения индекс. Ако няма такъв, връщате първия елемент. + - оператор {` +=} вмъква елементите в началото на масива -- [`String`], който "имплементира" динамично-заделен масив от букви, като +- {` String}, който "имплементира" динамично-заделен масив от букви, като .bulleted - - оператор [`[]`] връща индекс на брой (първата, втората, ...) главна буква в низа. Ако няма такава, тогава връща последната буква. - - оператор [`+=`] вмъква елементите в края на масива + - оператор {` []} връща индекс на брой (първата, втората, ...) главна буква в низа. Ако няма такава, тогава връща последната буква. + - оператор {` +=} вмъква елементите в края на масива Имплементирайте голяма петица. .question Къде ще имплементирате динамичния масив и голямата петица? -.question Можем ли да използваме оператор [`+=`] в полиморфна йерархия? +.question Можем ли да използваме оператор {` +=} в полиморфна йерархия? ### Задача 8 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise08 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise08} .comment Abstract class -Имплементирайте абстрактен клас [`Message`], който съдържа динамично-заделен низ (текстово съобщение, което се показва на екрана) и задължава наследниците да имплементират: +Имплементирайте абстрактен клас {` Message}, който съдържа динамично-заделен низ (текстово съобщение, което се показва на екрана) и задължава наследниците да имплементират: .unordered -- метод [`size`], който връща общия размер на всички данни в байтове. +- метод {` size}, който връща общия размер на всички данни в байтове. -Реализирайте негов наследник [`Link`] (хипервръзка), който запазва и втори динамично-заделен низ, запазващ адресът към който линкът сочи. +Реализирайте негов наследник {` Link} (хипервръзка), който запазва и втори динамично-заделен низ, запазващ адресът към който линкът сочи. -Реализирайте втори негов наследник [`Location`], чието текстово съдържание е адрес, и който допълнително запазва две стойности с плаваща запетая: една за географска ширина и втора за географска дължина. +Реализирайте втори негов наследник {` Location}, чието текстово съдържание е адрес, и който допълнително запазва две стойности с плаваща запетая: една за географска ширина и втора за географска дължина. -За всички класове реализирайте член-функция [`Length`], която връща размера на [=текстовото съобщение=] и оператор [`<<`]. +За всички класове реализирайте член-функция {` Length}, която връща размера на {b текстовото съобщение} и оператор {` <<}. -.question Има ли разлика между оператор [`<<`] на трите класа? +.question Има ли разлика между оператор {` <<} на трите класа? ### Задача 9 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise09 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise09} -Реализирайте абстрактен шаблонен клас [`MixedArray`], който съхранява алтерниращи елементи от два типа. +Реализирайте абстрактен шаблонен клас {` MixedArray}, който съхранява алтерниращи елементи от два типа. Тоест, на индекс 0 имаме елемент от първия тип, на индекс 1 от втория, на индекс 2 от първи и так. нат. -Елементите не е нужно да могат да се конвертират помежду си (тоест не може да използвате полиморфен контейнер), затова се достъпват с член функция [`At`], приемаща индекс и референции към указатели към всеки тип. -При подаден индекс, на единия указател се записва адресът на съответната стойност, а на другия [`nullptr`]. +Елементите не е нужно да могат да се конвертират помежду си (тоест не може да използвате полиморфен контейнер), затова се достъпват с член функция {` At}, приемаща индекс и референции към указатели към всеки тип. +При подаден индекс, на единия указател се записва адресът на съответната стойност, а на другия {` nullptr}. -Също имплементира голяма петица и задължава наследниците да имплементират оператори [`+=`], върщащи указател. +Също имплементира голяма петица и задължава наследниците да имплементират оператори {` +=}, върщащи указател. -Реализирайте негов наследник [`DirectConcat`], който реализира [`+=`] като директно слепване (конкатениране). +Реализирайте негов наследник {` DirectConcat}, който реализира {` +=} като директно слепване (конкатениране). -Реализирайте втори негов наследник, [`MixedConcat`], който реализир [`+=`] като алтернира елемент от първия масив с елемент от втория. +Реализирайте втори негов наследник, {` MixedConcat}, който реализир {` +=} като алтернира елемент от първия масив с елемент от втория. ## Трудни @@ -183,7 +186,7 @@ GitHub classroom: [url https://classroom.github.com/a/oYQehcnN classroom.github. Имплементирайте клас Document, който запазва масив от Node-ове и за който са имплементирани: .bulleted -- методи save и load, които запазват и четат цялото съдържание на документа в [=текстов=] файл с произволен формат. +- методи save и load, които запазват и четат цялото съдържание на документа в {b текстов} файл с произволен формат. ### Задача 11 |