aboutsummaryrefslogtreecommitdiff
path: root/week11/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'week11/README.md')
-rw-r--r--week11/README.md113
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`, който реализир `+=` като алтернира елемент от първия масив с елемент от втория.
## Трудни