aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSyndamia <kamen@syndamia.com>2024-03-07 17:20:53 +0200
committerSyndamia <kamen@syndamia.com>2024-03-07 17:20:53 +0200
commitc4efdf0a5b9af3d70d75f4ab642305d44e27ba1f (patch)
tree42fd154ce1b53b4bd69d58af6f6aceb647d9e806
parent449d0043523f13b4fd273e381b192b6fe10baefd (diff)
downloadoop-2023-solutions-c4efdf0a5b9af3d70d75f4ab642305d44e27ba1f.tar
oop-2023-solutions-c4efdf0a5b9af3d70d75f4ab642305d44e27ba1f.tar.gz
oop-2023-solutions-c4efdf0a5b9af3d70d75f4ab642305d44e27ba1f.zip
[w3] Added exercise descriptions
-rw-r--r--week03/README.md159
1 files changed, 159 insertions, 0 deletions
diff --git a/week03/README.md b/week03/README.md
new file mode 100644
index 0000000..beb581d
--- /dev/null
+++ b/week03/README.md
@@ -0,0 +1,159 @@
+# Задачи - ООП, Седмица 3, 07.03.2024
+
+*Този файл е копие на задачите от: [syndamia.com/teaching/oop-2023/week3](https://syndamia.com/teaching/oop-2023/week3)*
+
+## Преговорни
+
+### Задача 1 - Структури
+
+Имплементирайте структура `Lightbulb`, която запазва идентифициращите данни за една крушка:
+
+- диаметър и дължина: и двете са целочислени стойности
+- тип: низ с максимална дължина от 100 знака
+- серия: буква на латиница
+
+### Задача 2 - Капсулация
+
+Имплементирайте структура `Alarm`, която съдържа следните **скрити** данни:
+
+- име на модел: низ с максимална дължина от 1024 знака
+- пин код: целочислено число
+- ревизия на модела: число с плаваща запетая
+
+За всяка данна трябва да създадете съответните get-ъри и set-ъри: публични член-функции, които съответно връщат и записват всяка от изброените скрити стойности.
+
+При set-ърите имплементирайте следните проверки:
+
+- името на модела може да има само главни букви
+- пин кода трябва да бъде 4 цифри (нули са позволени)
+- ревизията трябва да бъде положително число
+
+Ако дадена проверка не е изпълнена, не записвате новата стойност (и оставяте старата).
+
+### Задача 3 - Капсулация с динамична памет
+
+Имплементирайте структура `Person`, която запазва двете имена на човек, възраст като целочислено число и неговия имейл.
+Имената и имейла са низвое с произволна дължина.
+
+Направете конструктор, който приема възрастта и тези три низа, и **копира** стойностите им в динамичната памет.
+Също напишете и деструктор, който коректно трие нужните данни.
+
+### Задача 4 - Динамично-заделени структури в други структури
+
+Имплементирайте структура `Bus`, която публично запазва капацитета хора и километража на един автобус.
+
+Имплементирайте структура `BusWarehouse`, която запазва динамично-заделен масив от автобуси.
+В конструктора се въвежда максималния брой автобуси, който може един `BusWarehouse` да съдържа.
+
+Имплементирайте конструктор, който само инициализира нужните данни, и деструктор който трие каквото трябва.
+Имплементирайте член-функция `AddBus`, която добавя автобус в инстанция на `BusWarehouse`, ако има място за него.
+
+## Лесни задачи
+
+### Задача 5
+
+Имплементирайте структура `Car`, всяка кола пази скрито своя модел като низ с произволна дължина, брой врати и брой седалки като целочислени числа.
+Направете съответните get-ъри, set-ъри, конструктор и деструктор.
+
+Имплементирайте структура `TrafficJam`, която пази произволно дълга редица коли в задръстване.
+Направете и член-функция `AddCar`, която вмъква кола в края на редицата.
+Тази функция може да се извиква произволен брой пъти, затова имплементирайте и оразмеряване на вътрешната редица.
+
+`TrafficJam` трябва да има конструктор, деструктор и тази член-функция.
+
+### Задача 6
+
+Ще работите с N-мерна шахматна дъска.
+
+Направете структура `ChessPiece`, която запазва цвета и типа на фигурата от шах, като първото е целочислена стойност, второто е буква.
+
+Направете структура `ChessBoard`, която по подадено N в конструктора създава шахматна дъска с размер NxN с **указатели** към съответните фигури на дъската.
+Разбира се, някои от тези указатели трябва да сочат към някакви създадени шахматни фигури.
+
+При създаване на дъската, трябва да подредите фигурите.
+На най-долните два реда присъстват белите фигури, на най-горните два - черните.
+За дъска 8х8, фигурите са подредени както нормално:
+
+![](https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/The_chess_board_from_Chess.jpg/1024px-The_chess_board_from_Chess.jpg?20210610045654)
+
+При по-големи дъски започвате да повтаряте редиците, докато при по-малките ги режете, от дясната страна.
+Тоест в дъска 10x10 първите 8 колони изглеждат като на картинката, на 9та колона (отгоре-надолу) имате черен топ, черна пешка, 6 празни места, бяла пешка, бял топ и на последната колона са черен кон, черна пешка, 6 празни места, бяла пешка, бял кон.
+
+Ако N не е поне 5, програмата ви трябва да хвърли грешка.
+Не забравяйте да напишете и деструктор.
+
+### Задача 7
+
+Имате затворени интервали от целочислени числа.
+Разглеждаме смесване на интервали:
+
+- смеската на допиращи се интервали е тяхното слепване, тоест смеската на `[0, 3]` и `[3, 5]` е `[0, 5]`
+- смеската на препокриващи се интервали е тяхното обединение, тоест смеската на `[0, 5]` и `[3, 8]` е `[0, 8]`
+
+В противен случай не можем да смесим интервалите (примерно не можем да смесим `[0, 3]` и `[4, 8]`).
+
+Започвайки от някакво множество с интервали, смесете колкото се може повече от тях и изкарайте всичките резултатни интервали, които не могат повече да се смесят.
+Използвайте структури и член-функции.
+
+### Задача 8
+
+"Моделирайте" (тоест сами се сетете за типовете данни и нужните структури) един град със следните харакетристики.
+
+В града имате два типа сгради: жилищни и търговски.
+
+- Жилищните се харакетиризират с цена на апратамент, бройката етажи, количеството хора, които се побират на един етаж (една стойност за всички етажи) и дали имат мазе, паркомясто и/или таван.
+- Търговските се характеризират с цена на магазин, бройка етажи с паркинг, бройка етажи с магазини и максимално количество магазини, които се побират на един етаж (една стойност за всички етажи).
+
+Градът трябва да пази всички отделни сгради, като допълнително за всяка жилищна трябва да съхранява общата бройка жители, a за всяка търговска - общата бройка отворени магазини.
+Освен това трябва да се съхрани и нещо като карта на всичките сгради: допускаме Старозагоско/Манхатънско подреждане на сградите, тоест всички сгради се намират върху някаква "решетка".
+
+&:question Познавате ли структурата `Pair`?
+
+Имплементирайте възможност за построяване и събаряне на сгради.
+Направете нужните проверки на всички данни: цената да не е отрицателна, бройката жители да не надвишава капацитета на сградата и так. нат.
+
+## Трудни задачи
+
+### Задача 9
+
+Ще разглеждаме нещо като UNIX-базирана файлова система.
+
+Един файл във файловата система се характеризира с идентификационен номер (цяло неотрицателно число), брой твърди връзки (пак цяло неотрицателно число), тип (определен от цяло число) и данни (масив от цели числа).
+Ще разглеждаме два типа файлове: нормални и директории.
+
+В нормалните файлове, данните се интерпретират като една редица от числа.
+
+Директориите запазват имена на файлове (кодирани в числа, по начин който вие решите) и съответните им идентификационни номера.
+Нека имената да са закодирани на четните индекси в данните, докато идентификационните номера: нечетните.
+Когато една директория е запазила име към някакъв файл, броят твърди връзки на съответния файл се увеличава.
+
+Имплементирайте файловата система, чрез нея трябва да можем да създадем или изтрием файлове.
+При изтриване на файл, броят твърди връзки към него се намалява.
+Ако той стане нула, паметта за файла се освобождава.
+
+Във файловата система, всички файлове са подредени на случаен принцип (затова използваме идентификационен номер, вместо индекс в масив).
+Винаги започваме с една празна начална директория.
+
+Двете функции, за създаване и изтриване, трябва да приемат масив от низове, който определя път от директории към желания файл, започвайки от началния файл.
+Тоест, ако бяха подадени низовете `Documents`, `Personal`, `Health`, `receipt.txt`, тогава от началния файл намираме името `Documents` и "влизаме" в директорията със съответния идентификационен номер, в нея намираме името `Personal` и так. нат.
+
+### Задача 10
+
+Намираме се в равнината, при която всички (двуизмерни) координати са **целочислени**.
+
+В нея имаме стъклени панели (прави отсечки), дефинирани с координатите на двете им крайни точки.
+Допълнително всеки панел си има свой цвят (като проценти, между 0 и 1, от цветовете червено, зелено и синьо) и прозрачност (като процент, между 0 и 1).
+
+Също имаме и един лъч, той се характеризира с началния си координат и единичен двуизмерен вектор, определящ неговата посока на движение.
+Този лъч не се пречупва и винаги се движи напред (преместването на лъча се извършва чрез `позиция = позиция + посока`).
+
+Чрез този лъч трябва да изкарате композитния цвят, след като лъча е минал през всички стъклени панели пред него.
+Нека също композитния цвят винаги да има 100% прозрачност.
+
+Примерно, ако лъча премине през един панел с цветови проценти `0,1,0` и прозрачност `0.5` и още един панел с цветови проценти `0,1,1` и прозрачност `0.5`, тогава композитния цвят е `0,1,0.5`.
+
+&:question Колко структури ще ви трябват?
+
+## Признания
+
+Изображението на шахматната дъска от chess.com, направено от Hfjhjoiijklij4 за [Уикипедия](https://commons.wikimedia.org/w/index.php?curid=106440749) под лиценз CC BY-SA 4.0