diff options
| author | Syndamia <kamen@syndamia.com> | 2024-03-07 17:20:53 +0200 |
|---|---|---|
| committer | Syndamia <kamen@syndamia.com> | 2024-03-07 17:20:53 +0200 |
| commit | c4efdf0a5b9af3d70d75f4ab642305d44e27ba1f (patch) | |
| tree | 42fd154ce1b53b4bd69d58af6f6aceb647d9e806 /week03 | |
| parent | 449d0043523f13b4fd273e381b192b6fe10baefd (diff) | |
| download | oop-2023-solutions-c4efdf0a5b9af3d70d75f4ab642305d44e27ba1f.tar oop-2023-solutions-c4efdf0a5b9af3d70d75f4ab642305d44e27ba1f.tar.gz oop-2023-solutions-c4efdf0a5b9af3d70d75f4ab642305d44e27ba1f.zip | |
[w3] Added exercise descriptions
Diffstat (limited to 'week03')
| -rw-r--r-- | week03/README.md | 159 |
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, фигурите са подредени както нормално: + + + +При по-големи дъски започвате да повтаряте редиците, докато при по-малките ги режете, от дясната страна. +Тоест в дъска 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 |
