aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSyndamia <kamen@syndamia.com>2024-05-10 12:34:43 +0300
committerSyndamia <kamen@syndamia.com>2024-05-10 12:34:43 +0300
commit94c45e51a5ab456ded3130450ac5bf2b4a1d1ff5 (patch)
tree4e0dfdb988ba38e76099fe291446f1c67b6f3384
parenteb6305c8b0a71a613a34edbcabdaf1fde259451d (diff)
downloadoop-2023-solutions-94c45e51a5ab456ded3130450ac5bf2b4a1d1ff5.tar
oop-2023-solutions-94c45e51a5ab456ded3130450ac5bf2b4a1d1ff5.tar.gz
oop-2023-solutions-94c45e51a5ab456ded3130450ac5bf2b4a1d1ff5.zip
[w11,w12] Updated task descriptions
-rw-r--r--week11/README.md113
-rw-r--r--week12/README.md94
2 files changed, 175 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`, който реализир `+=` като алтернира елемент от първия масив с елемент от втория.
## Трудни
diff --git a/week12/README.md b/week12/README.md
new file mode 100644
index 0000000..6df9447
--- /dev/null
+++ b/week12/README.md
@@ -0,0 +1,94 @@
+# Задачи - ООП, Седмица 12, 09.05.2024
+
+*Този файл е копие на задачите от: [syndamia.com/teaching/oop-2023/week12](https://syndamia.com/teaching/oop-2023/week12)*
+
+### Задача 1
+
+&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week12/Exercise1)
+
+<!-- Multiple inheritance -->
+
+Реализирайте клас `Publication`, който пази:
+
+- низ от максимална дължина 1023, съхраняващ автори и
+- втори низ с максимална дължина от 255, съхраняващ име на (научно) списание.
+
+Реализирайте клас `TextDocument`, който пази неоразмеряем низ с текстово съдържание и неговия размер.
+
+Реализирайте наследник на двата класа `ScientificPaper`, който допълнително пази и низ от максимално 511 знака, съдържащ име на научна дисциплина.
+За всички класове реазлизирайте оператор <<.
+
+### Задача 2
+
+*Не говорим за нея, условието беше толкова сбъркано, че се наложи да я сваля*
+
+### Задача 3
+
+&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week12/Exercise3)
+
+Реализирайте абстрактен клас `MobileDevice`, който запазва:
+
+- телефонен номер като цяло неотрицателно число и
+- масив с максимална дължина от 511 знака за текстово съобщение.
+
+Допълнително нека:
+
+- класът да задължава имплементацията на метод `Show`,
+- да има член-функция `CanAccept`, която по подадено "хиперсъобщение" връща дали неговия номер съвпада с този на класа.
+ Под "хиперсъобщение" имаме предвид низ, който започва с телефонния номер, след това има шпация и след това е самото съобщение.
+- да има член-функция `Accept`, която по подадено "хиперсъобщение" запазва текстовото съобщение.
+ Ако номерът не съответства тогава хвърля грешка.
+
+Реализирайте негов наследник `Telephone`, за който `Show` изкарва съобщението на екрана.
+
+Реализирайте втори негов наследник `Pager`[^pager], който съхранява име на файл (като динамично-заделен низ) и `Show` изкарва съобщението в съответния файл.
+Разбира се, имплементирайте голяма петица.
+
+Реализирайте клас `TelecommunicationCompany`, който съхранява динамично-заделен и оразмеряем масив от (указатели към) `MobileDevice`.
+Имплементирайте всичко, **което е възможно**, от голяма петица.
+
+### Задача 4
+
+&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week12/Exercise4)
+
+<!-- Multiple inheritance with mixed class types, polymorphic container, and copying -->
+
+Реализирайте клас `Employee`, който запазва:
+
+- заплата като число с плаваща запетая и
+- производителост също като число с плаваща запетая.
+
+Производителността е множител на заплатата, тоест ако има производителност 0.5 значи работи като човек на който му плащат с половината заплата.
+
+Реализирайте абстрактен клас `Person`, който запазва:
+
+- име като низ с произволна дължина и
+- възраст като цяло неотрицателно число
+
+Допълнително задължава реализацията на член-функция `Workload`, връщаща стойност с плаваща запетая.
+Разбира се имплементирайте голяма петица.
+
+Реализирайте наследник на двата класа на име `Developer`, който допълнително запазва:
+
+- цяло неотрицателно число - брой проекти в които участва, и
+- второ което е брой проекти на които ще се пуска нова версия.
+
+Реализирайте оператори `++` и `--`, като префиксните променят броя проекти на които ще се пуска нова версия, докато постфиксните променя броя проекти в които участва.
+За него `Workload` се определя като 1.1 по всеки проект и допълнително по 2.3 за всеки проект на който ще се пуска нова версия.
+
+Реализирайте наследник на двата класа на име `Manager`, който допълнително запазва динамично-заделен и оразмеряем масив от `Person`, които менижира.
+
+Имплементирайте голяма петица и:
+
+- оператори `==` и `!=`, сравняващи хора по име
+- член-функция `StartManaging`, която приема `Person` и го запазва, и
+- член-функция `StopManaging`, която приема `Person` и го премахва от масива ако съществува в него.
+
+`Workload` се определя като 0.6 на човек който менижира.
+
+Финално реализирайте клас `Company`, който запазва масив от 128 указателя `Person` в компанията.
+Имплементирайте негова член-функция:
+
+- `PaymentDifference`, която връща с колко платената заплата на всички служители се отличава с тази според тяхната производителност
+
+[^pager]: От времето без мобилни телефони, хората са си купували пейджъри, които ти пращат нотификация ако някой ти звънне и не вдигнеш. Пейджърите са "заключени" за определени региони, тоест някой ти се обажда, не вдигаш, и всички телекомуникционни кули в региона изпращат съобщение "на теб ти звънна този", и пейджъра като засече сигнала ти писука. Мисля че също можеш да пращаш кратки съобщения. Не е било хич сигурна система, все още се ползва от болници в някои държави.