diff options
| author | Syndamia <kamen@syndamia.com> | 2024-03-28 09:44:36 +0200 |
|---|---|---|
| committer | Syndamia <kamen@syndamia.com> | 2024-03-28 09:44:36 +0200 |
| commit | fa99ad53c4c730df853f90f4ffe7a0855ecbc559 (patch) | |
| tree | efcbdc6717580e49557a5a6ef418d2b43d763439 | |
| parent | 70c2c3eab85bee3100ce1c749af03937a6e11e17 (diff) | |
| download | oop-2023-solutions-fa99ad53c4c730df853f90f4ffe7a0855ecbc559.tar oop-2023-solutions-fa99ad53c4c730df853f90f4ffe7a0855ecbc559.tar.gz oop-2023-solutions-fa99ad53c4c730df853f90f4ffe7a0855ecbc559.zip | |
[w5] Added exercise descriptions
| -rw-r--r-- | week05/README.md | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/week05/README.md b/week05/README.md new file mode 100644 index 0000000..af7f9df --- /dev/null +++ b/week05/README.md @@ -0,0 +1,102 @@ +# Задачи - ООП, Седмица 5, 21.03.2024 + +*Този файл е копие на задачите от: [syndamia.com/teaching/oop-2023/week5](https://syndamia.com/teaching/oop-2023/week5)* + +## Преговорни + +### 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 задача + +Имате точки в равнината. +Намерете най-малкия полукръг, който съдържа половината точки в себе си. +Точки върху ръбовете на полукръга се броят като част от кръга. +Центърът на полукръгът трябва да съвпада с някоя от точките. |
