Задачи - ООП, Седмица 3, 07.03.2024
GitHub classroom: classroom.github.com/a/KPMqXsFp
Преговорни
#Задача 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 за всяка търговска - общата бройка отворени магазини. Освен това трябва да се съхрани и нещо като карта на всичките сгради: допускаме Старозагоско/Манхатънско подреждане на сградите, тоест всички сгради се намират върху някаква “решетка”.
Познавате ли структурата 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
.
Колко структури ще ви трябват?
Признания
#Изображението на шахматната дъска от chess.com, направено от Hfjhjoiijklij4 за Уикипедия под лиценз CC BY-SA 4.0