Задачи - ООП, Седмица 4, 14.03.2024

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

Преговорни

Задача 1 - Капсулация

< Решение >

Имплементирайте структура Smartphone, която запазва скрито:

За всяка стойност напревете съответните get-ъри и set-ъри, правейки следните проверки при set-ърите:

При неизпълнено условие, хвърляте грешка.

Задача 2 - Капсулация с динамична памет

< Решение >

Имплементирайте структура Bee, която запазва възрастта на пчела чрез число с плаваща запетая и типа пчела с буква.

Имплементирайте структура BeeHive, която запазва динамично-заделен масив с всички реещи се пчели и друг динамично-заделен масив с всички яйца в кошера. Размерите на двата масива се подават на конструктора. Имплементирайте нужните конструктор и деструктор.

Лесни задачи

Задача 3

< Решение >

Имплементирайте структура Paper, която запазва своето текстово съдържание като низ от максимум 1024 знака и положително цяло число, определящо номера на страницата.

От входа получавате на един ред цялото текстото съдържание за един обект от тип Paper и на следващия ред - бройките копия N на дадения обект.

Създайте Paper обект със съответното съдържание и номер на страницата 1. Създайте динамично-заделен масив от Paper с размер N, като първия му елемент е новосъздадения обект, докато останалите са копия на първия обект.

При всяко копие, трябва да увеличите номера на страницата. Имплементирейте логиката чрез копиращ конструктор.

Задача 4

< Решение >

Създайте структура DynamicString, чиито конструктор приема низ с терминираща нула, заделя точно толкова динамична памет, колкото е нужно да се запази целия низ и копира буквите на низа в тази памет. Имплементирайте оператор равно.

question Какви данни трябва DynamicString да запазва скрито?

question Какво трябва оператор равно да направи, ако записваме в DynamicString с вече заделена памет? Тоест ако имахме:
DynamicString s1("Hello"); DynamicString s2("World"); s2 = s1;

Задача 5

< Решение >

Имплементирайте структура TVProgram, която запазва името на предаването като низ от максимум 1024 знака, начало на излъчване и край на излъчване като неотрицателни целочислени числа (като примерно 1347 е един часа и 47 минути следобед). Имплементирайте конструктор, деструктор, оператор равно и копиращ конструктор.

Имплементирайте структура TVChannel, която запазва динамично заделен масив от TVProgram, размера на динамично заделената памет и броя “ненулеви” елементи (програми, добавени с AddProgram).

Имплементирайте нейн метод AddProgram, който приема TVProgram по копие и го вмъква на последната свободна позиция в масива. Ако масива е пълен, трябва да го “оразмерите” (да направите нов, по-голям масив, да копирате данните от стария в новия, да изтриете стария и да обновите указателя да сочи към новия).

question Кога използвате копиращия конструктор на TVProgram и кога използвате оператор равно?

Трудни задачи

Задача 6

Ще разработим (изключително груба) симулация на вселената. За нас, гравитацията няма да бъде сила, която просто привлича тела към себе си, а сила която кара телата около нея да се въртят (“орбитират”) в перфектен кръг. Имаме много звезди и една планета, като звездите са винаги неподвижни, а планетата се влияе от тях.

Гравитационното привличане на звезда в своя център се определя от ъгъла θmax (в градуси). Планетата се върти около една звезда, използвайки стандартната матрица за ротация:

Ъгълът на въртене θ, спрямо разстоянието до една звезда, се определя чрез закона на обратните квадрати, тоест в зависимост от разстоянието d между центъра на звездата и центъра на планетата, то истинският ъгъл на завъртане е θ = θmax * 1 / d2.

Допълнително, ако имаме повече от една звезда, тогава ще използваме θ’ = max(θi - average(θ1, …, θn)), където θi е намереният ъгъл θ за i-тата звезда и имаме n на брой звезди.

Ефектът на това е, че ако имаме две звезди на еднакво разстояние с еднакъв ъгъл, тогава планетата е неподвижна, а ако някоя планета е с малко по-близка, тогава се върти около нея и то съвсем бавно.

Приемаме, че отнема единица време планетата да се завърти с ъгъл θ’, без значение размера на ъгъла. Целта на задачата е да върнете при коя звезда и за колко единици време планетата е успяла да извърши пълна ротация (разбира се, θ’ и планетата може да се измени след всяка ротация).

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