Задачи - ООП, Седмица 5, 21.03.2024

GitHub classroom: classroom.github.com/a/42ZZ56Mg

Преговорни

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

< Решение >

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

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

Не е нужно данните за пациентите да са скрити, но данните в болницата трябва да са.

2 задача - Копиращ конструктор и оператор=

< Решение >

Имплементирайте структура FloatArray, която запазва динамично-заделен масив от float стойности. Размерът на масива се подава в конструктора.

Имплементирайте копиращ конструктор, оператор= и get-ър/set-ър за елемент на индекс i.

Лесни задачи

3 задача

< Решение >

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

Имплементирайте голяма четворка за имейла.

4 задача

< Решение >

Имплементирайте структура за касов бон, която запазва скрит динамично-заделен масив от цени (числа с плаваща запетая). Можете да добавяте неограничен брой цени в края на касовия бон (ако масива е пълен, създавате по-голям и пренасяте стойностите). Можете да премахвате цени според индекс (и всички следващи се преместват с една позиция назад).

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

5 задача

< Решение >

Един контролен списък (checklist) пази няколко неща: булева стойност, дали е избран или не, текстово съдържание (низ с “произволна” дължина) и масив от контролни списъци (всеки списък от този масив ще наричам “подсписък” за удобство). Нека текстовото съдържание да не може да се редактира (задава се в конструктора и няма set-ър).

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

6 задача

< Решение >

Имате телефонен указател, който запазва масив от имена (низове). В началото винаги започва празен. Имплементирайте голяма четворка.

Имплементирайте метод InsertPerson, който вмъква ново име в указателя, като вмъкването запазва сортировка по азбучен ред. Тоест ако указателя беше { "Atanas", "Yavor" }, тогава след вмъкване на Boris ще имаме { "Atanas", "Boris", "Yavor" }.

important Имплементирайте вмъкване, запазващо “сортираност” без функция за сортиране!

7 задача

< Решение >

Имплементирайте структура водомер, която скрито запазва отчетеното количество вода (double). Има единствено конструктор по подразбиране, при който отчетеното количество е нула, метод AddWater, който увеличава брояча с подаденото количество вода и метод Print, който изкарва стойността на брояча на екрана. Имплементирайте голяма четворка (когато е нужно).

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

Имплементирайте метод SimulateDay, който “симулира” ден в сградата - към всички датчици се добавят между 0 и 0.42 вода (разглеждаме само числа с максимум 3 цифри след запетаята). Количеството е случайно за всеки ден.

Имплементирайте метод SimulateMonth, който “симулира” 30 дена в сградата, като на всеки 5 дена се прави “отчет” - всичките водомери се копират и запазват във вътрешен масив. На края на месеца изкарайте на екрана, на един ред, всичките водомери от първите дни (първи ден на първи отчет, първи ден на втори отчет, …), вторите дни, …

8 задача

Една интернет заявка се характеризира с тип (низ от максимум 4 знака), версия на протокола (положително число с плаваща запетая) и идентификатор (буква). Нека тези данни да са скрити, като единствено могат да се set-нат от конструктора (тоест няма set-ъри, но има get-ъри) и е имлементирана голяма четворка (когато е нужно).

Интернет сървър обработва интернет заявки, като всяка получена заявка я запазва в нормалните логове (динамично-заделен масив със заявки) и в логовете за грешки (друг динамично-заделен масив със заявки).

Разглеждаме четири типа заявки: GET, HEAD, POST и PUT. За всяка сървърът съдържа динамично-заделен масив от низове. Имплементирайте методи за добавяне на низ към всеки тип. Ако съответния масив от низове е пълен, тогава трябва да го уголемите.

Имплементирайте метод HandleRequest, който приема интернет заявка по копие, запазва я в нормалните логове и връща първия низ от масива на съответния тип, който започва с идентификатор-буквата. Ако такъв низ не съществува, тогава връща низа “Bad request” и добавя заявката и в логовете за грешки.

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

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

9 задача

Имате точки в равнината. Намерете най-малкия полукръг, който съдържа половината точки в себе си. Точки върху ръбовете на полукръга се броят като част от кръга. Центърът на полукръгът трябва да съвпада с някоя от точките.