diff options
Diffstat (limited to 'week11/README.md')
| -rw-r--r-- | week11/README.md | 113 |
1 files changed, 81 insertions, 32 deletions
diff --git a/week11/README.md b/week11/README.md index fe4bfa5..8d40454 100644 --- a/week11/README.md +++ b/week11/README.md @@ -6,102 +6,151 @@ &:warn Моля, не отделяйте на преговорните задачи повече от 30мин -&:important Ако за даден клас е имплементиран деструктор, тогава в него и всичките му деца трябва да добавите `virtual` пред деструктора! +&:important Всеки бащин клас, във всички случаи, трябва да има виртуален деструктор (`virtual ~ClassName();`). ### Задача 1 - Шаблони и оператори +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise01) + Реализирайте шаблонен клас множество, който запазва фиксиран брой елементи от подаден тип. Реализирайте голяма петица и оператори: -- +, += които действат като обединение -- \*, \*= които действат като сечение -- -, -= които действат като допълнение +- `+`, `+=` които действат като обединение +- `*`, `*=` които действат като сечение +- `-`, `-=` които действат като допълнение ### Задача 2 - Наследяване -Реализирайте клас Employee, съхраняващ име на човек, позиция и департамент като низове със съответно дължина 512, 128 и 64, заедно със заплата като число с плаваща запетая. +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise02) + +Реализирайте клас `Employee`, съхраняващ име на човек, позиция и департамент като низове със съответно дължина 512, 128 и 64, заедно със заплата като число с плаваща запетая. -Реализирайте негов наследник Manager, който допълнително пази масив с фиксиран размер от Employee. +Реализирайте негов наследник `Manager`, който допълнително пази масив с фиксиран размер от Employee. -Реализирайте наследника на Employee, Developer, който допълнително пази брой проекти върху който работи. +Реализирайте наследника на `Employee`, `Developer`, който допълнително пази брой проекти върху който работи. -Наследниците не могат да достъпят заплатата, но трябва да могат да достъпят другите данни на Employee. +Наследниците не могат да достъпят заплатата, но трябва да могат да достъпят другите данни на `Employee`. ## Лесни ### Задача 3 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise03) + <!-- Динамично свързване, Inherit 3 --> -Реализирайте клас Electronics, който съдържа модел (низ с максимална дължина от 255 знака), needsVolts и needsAmps (стойности с плаваща запетая). +Реализирайте клас `Electronics`, който съдържа модел (низ с максимална дължина от 255 знака), `needsVolts` и `needsAmps` (стойности с плаваща запетая). Имплементирайте негови наследници: -- Laptop, който допълнително съхранява размер на екрана като число с плаваща запетая -- WashingMachine, който допълнително запазва максимално тегло на прането, като цяло неотрицателно число -- Camera, която допълнително запазва резолюция като число с плаваща запетая (в мегапиксели) +- `Laptop`, който допълнително съхранява размер на екрана като число с плаваща запетая +- `WashingMachine`, който допълнително запазва максимално тегло на прането, като цяло неотрицателно число +- `Camera`, която допълнително запазва резолюция като число с плаваща запетая (в мегапиксели) -За всеки клас реализирайте член-функция Print, която изкарва всички данни на екрана. +За всеки клас реализирайте член-функция `Print`, която изкарва всички данни на екрана. -&:question Чрез статично или динамично свързване сте имплементирали Print? Каква е разликата? +&:question Чрез статично или динамично свързване сте имплементирали `Print`? Каква е разликата? ### Задача 4 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise04) + <!-- Dynamic linking, Inherit 2 --> -Реализирайте клас String, който запазва динамично-заделен масив. +Реализирайте клас `String`, който запазва динамично-заделен масив. + +Имплементирайте негов наследник `Name`, който допълнително запазва число: номер на името (първо име, бащино име (второ име), фамилия (трето име)). -Имплементирайте негов наследник Name, който допълнително запазва число: номер на името (първо име, бащино име (второ име), фамилия (трето име)). +Имплементирайте втори наследник на `String`, `Street`, който запазва и число: номер на улицата. -Имплементирайте втори наследник на String, Street, който запазва и число: номер на улицата. +Във всеки клас имплементирайте голяма петица, член-функция `Length`, като: -Във всеки клас имплементирайте голяма петица, член-функция length, като в String връща дължината на низа, в Name връща дължината на името умножена по номера си и в Street връща дължината на името на улицата плюс броя цифри в номера на улицата. +- в `String` връща дължината на низа, +- в `Name` връща дължината на името умножена по номера си и +- в `Street` връща дължината на името на улицата плюс броя цифри в номера на улицата. + +Самият низ в `String` **не** може да се достъпва от наследниците. ### Задача 5 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise05) + <!-- Templates 1 type --> -Реализирайте шаблонен клас Counted, който запазва елемент от подаден тип и неговата бройка (цяло неотрицателно число). -Имплементирайте оператори ++, --, +=, -=, които променят бройката. +Реализирайте шаблонен клас `Counted`, който запазва елемент от подаден тип и неговата бройка (цяло неотрицателно число). +Имплементирайте оператори `++`, `--`, `+=`, `-=`, които променят бройката, както и гетъри за елемента и бройката. ### Задача 6 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise06) + <!-- Templates 2 types --> -Реализирайте шаблонен клас TwoArray, който запазва два динамично-заделени масива с подадени типове. +Реализирайте шаблонен клас `TwoArray`, който запазва два динамично-заделени масива с подадени типове. Масивите не могат да се оразмеряват и имат еднаква дължина. -Имплементирайте голяма петица, оператор [], който по подаден индекс връща елемент от първия масив, и оператор (), който по подаден индекс връща елемент от втория масив. +Имплементирайте: + +- голяма петица, +- оператор `[]`, който по подаден индекс връща елемент от първия масив, и +- оператор `()`, който по подаден индекс връща елемент от втория масив. ### Задача 7 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise07) + <!-- Abstract class --> -Реализирайте абстрактен клас DynamicArray, който задължава наследниците да имплементират оператор [], оператор += и оператор +. +Реализирайте абстрактен клас `DynamicArray`, който задължава наследниците да имплементират оператор `[]` и оператор `+=`. + +Реализирайте негови наследници: + +- `Numbers`, който "имплементира" динамично-заделен масив от цели числа, като + + оператор `[]` връща първия елемент, по-малък от подадения индекс. Ако няма такъв, връщате първия елемент. + + оператор `+=` вмъква елементите в началото на масива +- `String`, който "имплементира" динамично-заделен масив от букви, като + + оператор `[]` връща индекс на брой (първата, втората, ...) главна буква в низа. Ако няма такава, тогава връща последната буква. + + оператор `+=` вмъква елементите в края на масива -Реализирайте негови наследници String, който имплементира динамично-заделен масив от букви, и Numbers, който имплементира динамично-заделен масив от числа. Имплементирайте голяма петица. +&:question Къде ще имплементирате динамичния масив и голямата петица? + +&:question Можем ли да използваме оператор `+=` в полиморфна йерархия? + ### Задача 8 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise08) + <!-- Abstract class --> -Имплементирайте абстрактен клас Message, който съдържа динамично-заделен низ (текстово съобщение) и задължава наследниците да имплементират метод size, който връща общия размер на всички данни в байтове. +Имплементирайте абстрактен клас `Message`, който съдържа динамично-заделен низ (текстово съобщение, което се показва на екрана) и задължава наследниците да имплементират: -Реализирайте негов наследник Link (хипервръзка), който запазва и втори динамично-заделен низ, запазващ адресът към който линкът сочи. +- метод `size`, който връща общия размер на всички данни в байтове. -Реализирайте втори негов наследник Location, чието текстово съдържание е адрес, и който допълнително запазва две стойности с плаваща запетая: една за географска ширина и втора за географска дължина. +Реализирайте негов наследник `Link` (хипервръзка), който запазва и втори динамично-заделен низ, запазващ адресът към който линкът сочи. -За всички класове реализирайте член-функция length, която връща размера на текстовото съобщение и operator<<. +Реализирайте втори негов наследник `Location`, чието текстово съдържание е адрес, и който допълнително запазва две стойности с плаваща запетая: една за географска ширина и втора за географска дължина. + +За всички класове реализирайте член-функция `Length`, която връща размера на **текстовото съобщение** и оператор `<<`. + +&:question Има ли разлика между оператор `<<` на трите класа? ### Задача 9 -Реализирайте абстрактен шаблонен клас MixedArray, който съхранява алтерниращи елементи от два типа, за тях имплементира голяма петица и задължава наследниците да имплементират оператори + и +=. -Елементите не е нужно да могат да се конвертират помежду си (тоест не може да използвате полиморфен контейнер). +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise09) + +Реализирайте абстрактен шаблонен клас `MixedArray`, който съхранява алтерниращи елементи от два типа. +Тоест, на индекс 0 имаме елемент от първия тип, на индекс 1 от втория, на индекс 2 от първи и так. нат. + +Елементите не е нужно да могат да се конвертират помежду си (тоест не може да използвате полиморфен контейнер), затова се достъпват с член функция `At`, приемаща индекс и референции към указатели към всеки тип. +При подаден индекс, на единия указател се записва адресът на съответната стойност, а на другия `nullptr`. + +Също имплементира голяма петица и задължава наследниците да имплементират оператори `+=`, върщащи указател. -Реализирайте негов наследник DirectConcat, който реализира + и += като директно слепване (конкатениране). +Реализирайте негов наследник `DirectConcat`, който реализира `+=` като директно слепване (конкатениране). -Реализирайте втори негов наследник, MixedConcat, който реализир + и += като алтернира елемент от първия масив с елемент от втория. +Реализирайте втори негов наследник, `MixedConcat`, който реализир `+=` като алтернира елемент от първия масив с елемент от втория. ## Трудни |
