From 94c45e51a5ab456ded3130450ac5bf2b4a1d1ff5 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 10 May 2024 12:34:43 +0300 Subject: [w11,w12] Updated task descriptions --- week11/README.md | 113 +++++++++++++++++++++++++++++++++++++++---------------- week12/README.md | 94 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 175 insertions(+), 32 deletions(-) create mode 100644 week12/README.md 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) + -Реализирайте клас 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) + -Реализирайте клас 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) + -Реализирайте шаблонен клас Counted, който запазва елемент от подаден тип и неговата бройка (цяло неотрицателно число). -Имплементирайте оператори ++, --, +=, -=, които променят бройката. +Реализирайте шаблонен клас `Counted`, който запазва елемент от подаден тип и неговата бройка (цяло неотрицателно число). +Имплементирайте оператори `++`, `--`, `+=`, `-=`, които променят бройката, както и гетъри за елемента и бройката. ### Задача 6 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise06) + -Реализирайте шаблонен клас TwoArray, който запазва два динамично-заделени масива с подадени типове. +Реализирайте шаблонен клас `TwoArray`, който запазва два динамично-заделени масива с подадени типове. Масивите не могат да се оразмеряват и имат еднаква дължина. -Имплементирайте голяма петица, оператор [], който по подаден индекс връща елемент от първия масив, и оператор (), който по подаден индекс връща елемент от втория масив. +Имплементирайте: + +- голяма петица, +- оператор `[]`, който по подаден индекс връща елемент от първия масив, и +- оператор `()`, който по подаден индекс връща елемент от втория масив. ### Задача 7 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise07) + -Реализирайте абстрактен клас DynamicArray, който задължава наследниците да имплементират оператор [], оператор += и оператор +. +Реализирайте абстрактен клас `DynamicArray`, който задължава наследниците да имплементират оператор `[]` и оператор `+=`. + +Реализирайте негови наследници: + +- `Numbers`, който "имплементира" динамично-заделен масив от цели числа, като + + оператор `[]` връща първия елемент, по-малък от подадения индекс. Ако няма такъв, връщате първия елемент. + + оператор `+=` вмъква елементите в началото на масива +- `String`, който "имплементира" динамично-заделен масив от букви, като + + оператор `[]` връща индекс на брой (първата, втората, ...) главна буква в низа. Ако няма такава, тогава връща последната буква. + + оператор `+=` вмъква елементите в края на масива -Реализирайте негови наследници String, който имплементира динамично-заделен масив от букви, и Numbers, който имплементира динамично-заделен масив от числа. Имплементирайте голяма петица. +&:question Къде ще имплементирате динамичния масив и голямата петица? + +&:question Можем ли да използваме оператор `+=` в полиморфна йерархия? + ### Задача 8 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise08) + -Имплементирайте абстрактен клас 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) + + + +Реализирайте клас `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) + + + +Реализирайте клас `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]: От времето без мобилни телефони, хората са си купували пейджъри, които ти пращат нотификация ако някой ти звънне и не вдигнеш. Пейджърите са "заключени" за определени региони, тоест някой ти се обажда, не вдигаш, и всички телекомуникционни кули в региона изпращат съобщение "на теб ти звънна този", и пейджъра като засече сигнала ти писука. Мисля че също можеш да пращаш кратки съобщения. Не е било хич сигурна система, все още се ползва от болници в някои държави. -- cgit v1.2.3