Задачи - ООП, Седмица 11, 09.05.2024

GitHub classroom: classroom.github.com/a/oYQehcnN

Преговорни

warn Моля, не отделяйте на преговорните задачи повече от 30мин

important Всеки бащин клас, във всички случаи, трябва да има виртуален деструктор (virtual ~ClassName();).

Задача 1 - Шаблони и оператори

< Решение >

Реализирайте шаблонен клас множество, който запазва фиксиран брой елементи от подаден тип. Реализирайте голяма петица и оператори:

Задача 2 - Наследяване

< Решение >

Реализирайте клас Employee, съхраняващ име на човек, позиция и департамент като низове със съответно дължина 512, 128 и 64, заедно със заплата като число с плаваща запетая.

Реализирайте негов наследник Manager, който допълнително пази масив с фиксиран размер от Employee.

Реализирайте наследника на Employee, Developer, който допълнително пази брой проекти върху който работи.

Наследниците не могат да достъпят заплатата, но трябва да могат да достъпят другите данни на Employee.

Лесни

Задача 3

< Решение >

Реализирайте клас Electronics, който съдържа модел (низ с максимална дължина от 255 знака), needsVolts и needsAmps (стойности с плаваща запетая).

Имплементирайте негови наследници:

За всеки клас реализирайте член-функция Print, която изкарва всички данни на екрана.

question Чрез статично или динамично свързване сте имплементирали Print? Каква е разликата?

Задача 4

< Решение >

Реализирайте клас String, който запазва динамично-заделен масив.

Имплементирайте негов наследник Name, който допълнително запазва число: номер на името (първо име, бащино име (второ име), фамилия (трето име)).

Имплементирайте втори наследник на String, Street, който запазва и число: номер на улицата.

Във всеки клас имплементирайте голяма петица, член-функция Length, като:

Самият низ в String не може да се достъпва от наследниците.

Задача 5

< Решение >

Реализирайте шаблонен клас Counted, който запазва елемент от подаден тип и неговата бройка (цяло неотрицателно число). Имплементирайте оператори ++, --, +=, -=, които променят бройката, както и гетъри за елемента и бройката.

Задача 6

< Решение >

Реализирайте шаблонен клас TwoArray, който запазва два динамично-заделени масива с подадени типове. Масивите не могат да се оразмеряват и имат еднаква дължина.

Имплементирайте:

Задача 7

< Решение >

Реализирайте абстрактен клас DynamicArray, който задължава наследниците да имплементират оператор [] и оператор +=.

Реализирайте негови наследници:

Имплементирайте голяма петица.

question Къде ще имплементирате динамичния масив и голямата петица?

question Можем ли да използваме оператор += в полиморфна йерархия?

Задача 8

< Решение >

Имплементирайте абстрактен клас Message, който съдържа динамично-заделен низ (текстово съобщение, което се показва на екрана) и задължава наследниците да имплементират:

Реализирайте негов наследник Link (хипервръзка), който запазва и втори динамично-заделен низ, запазващ адресът към който линкът сочи.

Реализирайте втори негов наследник Location, чието текстово съдържание е адрес, и който допълнително запазва две стойности с плаваща запетая: една за географска ширина и втора за географска дължина.

За всички класове реализирайте член-функция Length, която връща размера на текстовото съобщение и оператор <<.

question Има ли разлика между оператор << на трите класа?

Задача 9

< Решение >

Реализирайте абстрактен шаблонен клас MixedArray, който съхранява алтерниращи елементи от два типа. Тоест, на индекс 0 имаме елемент от първия тип, на индекс 1 от втория, на индекс 2 от първи и так. нат.

Елементите не е нужно да могат да се конвертират помежду си (тоест не може да използвате полиморфен контейнер), затова се достъпват с член функция At, приемаща индекс и референции към указатели към всеки тип. При подаден индекс, на единия указател се записва адресът на съответната стойност, а на другия nullptr.

Също имплементира голяма петица и задължава наследниците да имплементират оператори +=, върщащи указател.

Реализирайте негов наследник DirectConcat, който реализира += като директно слепване (конкатениране).

Реализирайте втори негов наследник, MixedConcat, който реализир += като алтернира елемент от първия масив с елемент от втория.

Трудни

Задача 10

Реализирайте система за документ с форматиран текст. В нея всеки елемент от документа е от тип Node, като за един Node трябва да имате:

Реализирайте следните типове Node:

Имплементирайте клас Document, който запазва масив от Node-ове и за който са имплементирани:

Задача 11

Ще реализирате система за изпълнение на крайни автомати (от Теоретични Компютърни науки, ЕАИ).

За тази цел е нужен абстрактен шаблонен клас State, чиито тип определя азбуката, който съхранява динамично-заделен масив от преходи (Transition) и задължава protected имплементация на член-функцията equal, която приема два елемента от азбуката и връща дали са равни. Имплементирайте голяма петица и оператор +=, който вмъква нов преход в състоянието.

Реализирайте абстрактен шаблонен клас Transition, чиито тип определя азбуката, и който съхранява елемент от този тип (стойността, която ако е равна на подадената ще изпълним прехода) и указател към следващо състояние. Класът задължава имплементацията на оператор [], който по подаден елемент от азбуката или връща указателя към следващото състояние, или връща nullptr.

Реализирайте наследник на State, ArrayState, който (допускате че) приема указател на динамичо-заделен масив.

Реализирайте наследник на Transition, PrintedTransition, който при всяко извикване на оператор [] също изкарва съобщение на екрана.

Реализирайте клас FiniteStateMachine, който съхранява динамичен масив от състояния. За него имплементирайте голяма петица и конструктор, приемащ име на текстов файл в CSV формат, в който са запазени:

Имплементирайте метод Run, който изпълнява автомата и връща булева стойност: дали приема входните букви или не.