# Задачи - ООП, Седмица 11, 09.05.2024 \n GitHub classroom: [url https://classroom.github.com/a/oYQehcnN classroom.github.com/a/oYQehcnN] ## Преговорни .warn Моля, не отделяйте на преговорните задачи повече от 30мин .important Всеки бащин клас, във всички случаи, трябва да има виртуален деструктор ([`virtual ~ClassName();`]). ### Задача 1 - Шаблони и оператори .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 Решение] Реализирайте клас [`Employee`], съхраняващ име на човек, позиция и департамент като низове със съответно дължина 512, 128 и 64, заедно със заплата като число с плаваща запетая. Реализирайте негов наследник [`Manager`], който допълнително пази масив с фиксиран размер от Employee. Реализирайте наследника на [`Employee`], [`Developer`], който допълнително пази брой проекти върху който работи. Наследниците не могат да достъпят заплатата, но трябва да могат да достъпят другите данни на [`Employee`]. ## Лесни ### Задача 3 .solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise03 Решение] .comment Динамично свързване, Inherit 3 Реализирайте клас [`Electronics`], който съдържа модел (низ с максимална дължина от 255 знака), [`needsVolts`] и [`needsAmps`] (стойности с плаваща запетая). Имплементирайте негови наследници: .bulleted - [`Laptop`], който допълнително съхранява размер на екрана като число с плаваща запетая - [`WashingMachine`], който допълнително запазва максимално тегло на прането, като цяло неотрицателно число - [`Camera`], която допълнително запазва резолюция като число с плаваща запетая (в мегапиксели) За всеки клас реализирайте член-функция [`Print`], която изкарва всички данни на екрана. &:question Чрез статично или динамично свързване сте имплементирали [`Print`]? Каква е разликата? ### Задача 4 .solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise04 Решение] .comment Dynamic linking, Inherit 2 Реализирайте клас [`String`], който запазва динамично-заделен масив. Имплементирайте негов наследник [`Name`], който допълнително запазва число: номер на името (първо име, бащино име (второ име), фамилия (трето име)). Имплементирайте втори наследник на [`String`], [`Street`], който запазва и число: номер на улицата. Във всеки клас имплементирайте голяма петица, член-функция [`Length`], като: .bulleted - в [`String`] връща дължината на низа, - в [`Name`] връща дължината на името умножена по номера си и - в [`Street`] връща дължината на името на улицата плюс броя цифри в номера на улицата. Самият низ в [`String`] [=не=] може да се достъпва от наследниците. ### Задача 5 .solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise05 Решение] .comment Templates 1 type Реализирайте шаблонен клас [`Counted`], който запазва елемент от подаден тип и неговата бройка (цяло неотрицателно число). Имплементирайте оператори [`++`], [`--`], [`+=`], [`-=`], които променят бройката, както и гетъри за елемента и бройката. ### Задача 6 .solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise06 Решение] .comment Templates 2 types Реализирайте шаблонен клас [`TwoArray`], който запазва два динамично-заделени масива с подадени типове. Масивите не могат да се оразмеряват и имат еднаква дължина. Имплементирайте: .bulleted - голяма петица, - оператор [`[]`], който по подаден индекс връща елемент от първия масив, и - оператор [`()`], който по подаден индекс връща елемент от втория масив. ### Задача 7 .solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise07 Решение] .comment Abstract class Реализирайте абстрактен клас [`DynamicArray`], който задължава наследниците да имплементират оператор [`[]`] и оператор [`+=`]. Реализирайте негови наследници: :unordered - [`Numbers`], който "имплементира" динамично-заделен масив от цели числа, като .bulleted - оператор [`[]`] връща първия елемент, по-малък от подадения индекс. Ако няма такъв, връщате първия елемент. - оператор [`+=`] вмъква елементите в началото на масива - [`String`], който "имплементира" динамично-заделен масив от букви, като .bulleted - оператор [`[]`] връща индекс на брой (първата, втората, ...) главна буква в низа. Ако няма такава, тогава връща последната буква. - оператор [`+=`] вмъква елементите в края на масива Имплементирайте голяма петица. .question Къде ще имплементирате динамичния масив и голямата петица? .question Можем ли да използваме оператор [`+=`] в полиморфна йерархия? ### Задача 8 .solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise08 Решение] .comment Abstract class Имплементирайте абстрактен клас [`Message`], който съдържа динамично-заделен низ (текстово съобщение, което се показва на екрана) и задължава наследниците да имплементират: .unordered - метод [`size`], който връща общия размер на всички данни в байтове. Реализирайте негов наследник [`Link`] (хипервръзка), който запазва и втори динамично-заделен низ, запазващ адресът към който линкът сочи. Реализирайте втори негов наследник [`Location`], чието текстово съдържание е адрес, и който допълнително запазва две стойности с плаваща запетая: една за географска ширина и втора за географска дължина. За всички класове реализирайте член-функция [`Length`], която връща размера на [=текстовото съобщение=] и оператор [`<<`]. .question Има ли разлика между оператор [`<<`] на трите класа? ### Задача 9 .solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise09 Решение] Реализирайте абстрактен шаблонен клас [`MixedArray`], който съхранява алтерниращи елементи от два типа. Тоест, на индекс 0 имаме елемент от първия тип, на индекс 1 от втория, на индекс 2 от първи и так. нат. Елементите не е нужно да могат да се конвертират помежду си (тоест не може да използвате полиморфен контейнер), затова се достъпват с член функция [`At`], приемаща индекс и референции към указатели към всеки тип. При подаден индекс, на единия указател се записва адресът на съответната стойност, а на другия [`nullptr`]. Също имплементира голяма петица и задължава наследниците да имплементират оператори [`+=`], върщащи указател. Реализирайте негов наследник [`DirectConcat`], който реализира [`+=`] като директно слепване (конкатениране). Реализирайте втори негов наследник, [`MixedConcat`], който реализир [`+=`] като алтернира елемент от първия масив с елемент от втория. ## Трудни ### Задача 10 Реализирайте система за документ с форматиран текст. В нея всеки елемент от документа е от тип Node, като за един Node трябва да имате: .bulleted - id, автоматично-избрано число, с което отличава Node - operator<< - operator[] Реализирайте следните типове Node: .bulleted - paragraph, това е най-обикновен низ - anchor, това е хипервръзка (линк), която съхранява видимо съдържание и уеб адрес - emplaced link, това е хипервръзка при която видимото съдържание съвпада с уеб адреса - заглавие, което е като хипервръзка, но уеб адресът започва с '#' и останалото съвпада със текстовото съдържание, като всяка буква е малка и вместо шпации има тирета - bulletpoint list, който съхранява редица Node-ове и ги изкарва на екрана, всяко на нов ред, започващи с '-' - table, която съхранява таблица с Node-ове Имплементирайте клас Document, който запазва масив от Node-ове и за който са имплементирани: .bulleted - методи save и load, които запазват и четат цялото съдържание на документа в [=текстов=] файл с произволен формат. ### Задача 11 Ще реализирате система за изпълнение на крайни автомати (от Теоретични Компютърни науки, ЕАИ). За тази цел е нужен абстрактен шаблонен клас State, чиито тип определя азбуката, който съхранява динамично-заделен масив от преходи (Transition) и задължава protected имплементация на член-функцията equal, която приема два елемента от азбуката и връща дали са равни. Имплементирайте голяма петица и оператор +=, който вмъква нов преход в състоянието. Реализирайте абстрактен шаблонен клас Transition, чиито тип определя азбуката, и който съхранява елемент от този тип (стойността, която ако е равна на подадената ще изпълним прехода) и указател към следващо състояние. Класът задължава имплементацията на оператор [], който по подаден елемент от азбуката или връща указателя към следващото състояние, или връща nullptr. Реализирайте наследник на State, ArrayState, който (допускате че) приема указател на динамичо-заделен масив. Реализирайте наследник на Transition, PrintedTransition, който при всяко извикване на оператор [] също изкарва съобщение на екрана. Реализирайте клас FiniteStateMachine, който съхранява динамичен масив от състояния. За него имплементирайте голяма петица и конструктор, приемащ име на текстов файл в CSV формат, в който са запазени: .bulleted - на първия ред обща информация във формата "Transitions,StartStateName", след това - състояния и преходи във формата "StateName,OnValue,TransitionTo", после - финални състояния във формата "FinalStateName1,FinalStateName2,...", и накрая - входни букви от азбуката "Letter1,Letter2,...". Имплементирайте метод Run, който изпълнява автомата и връща булева стойност: дали приема входните букви или не.